ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyYmMxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS42Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vLm9wdGlvbnMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vLm9wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NmRiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS8ub3B0aW9ucwpAQCAtMCwwICsxLDcgQEAKKyMgVHJhY2luZyBvcHRpb25zIGZvciB0aGUgY29tcmVsLmRpYWdyYW0gcGx1Zy1pbgorCisjIENvbW1vbiBpc3N1ZXMKK2NvbXJlbC5kaWFncmFtL2RlYnVnPWZhbHNlCisKKyMgVmlzdWFsIElEcworY29tcmVsLmRpYWdyYW0vZGVidWcvdmlzdWFsSUQ9ZmFsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDUzODUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHByb2plY3REZXNjcmlwdGlvbj4NCisJPG5hbWU+b3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtPC9uYW1lPg0KKwk8Y29tbWVudD48L2NvbW1lbnQ+DQorCTxwcm9qZWN0cz4NCisJPC9wcm9qZWN0cz4NCisJPGJ1aWxkU3BlYz4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwk8L2J1aWxkU3BlYz4NCisJPG5hdHVyZXM+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGQ3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw0NCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1OYW1lOiBDb01SZUwgRGlhZ3JhbQ0KK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbTtzaW5nbGV0b246PXRydWUNCitCdW5kbGUtVmVyc2lvbjogMC45LjANCitCdW5kbGUtQ2xhc3NQYXRoOiAuDQorQnVuZGxlLUFjdGl2YXRvcjogY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luDQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQorRXhwb3J0LVBhY2thZ2U6IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMsDQorIGNvbXJlbC5kaWFncmFtLnBhcnQsDQorIGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycw0KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KKyBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLA0KKyBvcmcuZWNsaXBzZS5qZmFjZSwNCisgb3JnLmVjbGlwc2UudWkuaWRlLA0KKyBvcmcuZWNsaXBzZS51aS52aWV3cywNCisgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLA0KKyBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLA0KKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsDQorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksDQorIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZSwNCisgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUsDQorIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzLA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlciwNCisgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzLA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycywNCisgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciwNCisgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLA0KKyBvcmcuZWNsaXBzZS5kcmF3MmQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwNCisgb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5vY2w7YnVuZGxlLXZlcnNpb249IjEuNC4wIiwNCisgb3JnLmVjbGlwc2Uub2NsLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSIzLjAuMiINCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQ0KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS42DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2Jpbi8uZ2l0aWdub3JlIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2Jpbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGRiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vYmluLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorL2NvbXJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTFjYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMiBAQAorYmluLmluY2x1ZGVzID0gLixcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgbWVzc2FnZXMucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICAub3B0aW9ucyxcCisgICAgICAgICAgICAgICBzcmMvLFwKKyAgICAgICAgICAgICAgIGJpbi8KK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9pY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTljNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9pY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTljNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9pY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTljNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvbGlua3NOYXZpZ2F0b3JHcm91cC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvbGlua3NOYXZpZ2F0b3JHcm91cC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhOWM1MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9pY29ucy9saW5rc05hdmlnYXRvckdyb3VwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvb2JqMTYvQ29tcmVsRGlhZ3JhbUZpbGUuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2ljb25zL29iajE2L0NvbXJlbERpYWdyYW1GaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzlhZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2ljb25zL29iajE2L0NvbXJlbERpYWdyYW1GaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9pY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTljNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvc2hvcnRjdXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2ljb25zL3Nob3J0Y3V0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGViYjMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL2ljb25zL3Nob3J0Y3V0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvd2l6YmFuL05ld0NvbXJlbFdpemFyZC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vaWNvbnMvd2l6YmFuL05ld0NvbXJlbFdpemFyZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiMjJhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9pY29ucy93aXpiYW4vTmV3Q29tcmVsV2l6YXJkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vbWVzc2FnZXMucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjdmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDI1OSBAQAorCisjIFRPRE86IG1hbnVhbGx5IHB1dCBrZXlzIGFuZCB2YWx1ZXMKK0NvbXJlbENyZWF0aW9uV2l6YXJkVGl0bGU9TmV3IENvbXJlbCBEaWFncmFtCitDb21yZWxDcmVhdGlvbldpemFyZF9EaWFncmFtTW9kZWxGaWxlUGFnZVRpdGxlPUNyZWF0ZSBDb21yZWwgRGlhZ3JhbQorQ29tcmVsQ3JlYXRpb25XaXphcmRfRGlhZ3JhbU1vZGVsRmlsZVBhZ2VEZXNjcmlwdGlvbj1TZWxlY3QgZmlsZSB0aGF0IHdpbGwgY29udGFpbiBkaWFncmFtIG1vZGVsLgorQ29tcmVsQ3JlYXRpb25XaXphcmRfRG9tYWluTW9kZWxGaWxlUGFnZVRpdGxlPUNyZWF0ZSBDb21yZWwgRG9tYWluIE1vZGVsCitDb21yZWxDcmVhdGlvbldpemFyZF9Eb21haW5Nb2RlbEZpbGVQYWdlRGVzY3JpcHRpb249U2VsZWN0IGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gZG9tYWluIG1vZGVsLgorQ29tcmVsQ3JlYXRpb25XaXphcmRPcGVuRWRpdG9yRXJyb3I9RXJyb3Igb3BlbmluZyBkaWFncmFtIGVkaXRvcgorQ29tcmVsQ3JlYXRpb25XaXphcmRDcmVhdGlvbkVycm9yPUNyZWF0aW9uIFByb2JsZW1zCitDb21yZWxDcmVhdGlvbldpemFyZFBhZ2VFeHRlbnNpb25FcnJvcj1GaWxlIG5hbWUgc2hvdWxkIGhhdmUgezB9IGV4dGVuc2lvbi4KK0NvbXJlbERpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgorQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9RmFpbGVkIHRvIGxvYWQgbW9kZWwgZmlsZSB7MH0KK0NvbXJlbERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZXMKK0NvbXJlbERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwKK0NvbXJlbERvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlPVVwZGF0aW5nIGNhY2hlIGZhaWxlZAorQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ9RmFpbGVkIHRvIHJlZnJlc2ggaGllcmFyY2h5IGZvciBjaGFuZ2VkIHJlc291cmNlCitDb21yZWxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I9ezF9CitDb21yZWxEb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcj1EaWFncmFtIGlzIG5vdCBwcmVzZW50IGluIHJlc291cmNlCitDb21yZWxEb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I9RXJyb3IgbG9hZGluZyBkaWFncmFtCitDb21yZWxEb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcj1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQorQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s9U2F2aW5nIGRpYWdyYW0KK0NvbXJlbERvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s9U2F2aW5nIHswfQorQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9TYXZlQXNPcGVyYXRpb249U2F2aW5nIHswfSBkaWFncmFtIGFzCitJbml0RGlhZ3JhbUZpbGVfUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCitJbml0RGlhZ3JhbUZpbGVfUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U9TW9kZWwgZmlsZSBsb2FkaW5nIGZhaWxlZAorSW5pdERpYWdyYW1GaWxlX1dpemFyZFRpdGxlPUluaXRpYWxpemUgbmV3IHswfSBkaWFncmFtIGZpbGUKK0luaXREaWFncmFtRmlsZV9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU9U2VsZWN0IGRvbWFpbiBtb2RlbAorQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZT1Jbml0aWFsaXplIG5ldyBkaWFncmFtIGZpbGUKK0NvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlPURpYWdyYW0gZmlsZQorQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBkaWFncmFtIGJhc2VkIG9uIHswfSBtb2RlbCBjb250ZW50CitDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50CitDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlPURpYWdyYW0gcm9vdCBlbGVtZW50CitDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uPVNlbGVjdCBzZW1hbnRpYyBtb2RlbCBlbGVtZW50IHRvIGJlIGRlcGljdGVkIG9uIGRpYWdyYW0KK0NvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU9U2VsZWN0IGRpYWdyYW0gcm9vdCBlbGVtZW50OgorQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U9RGlhZ3JhbSByb290IGVsZW1lbnQgaXMgbm90IHNlbGVjdGVkCitDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlPUludmFsaWQgZGlhZ3JhbSByb290IGVsZW1lbnQgaXMgc2VsZWN0ZWQKK0NvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZD1Jbml0aWFsaXppbmcgZGlhZ3JhbSBjb250ZW50cworQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yPUluY29ycmVjdCBtb2RlbCBvYmplY3Qgc3RvcmVkIGFzIGEgcm9vdCByZXNvdXJjZSBvYmplY3QKK0NvbXJlbERpYWdyYW1FZGl0b3JfU2F2aW5nRGVsZXRlZEZpbGU9VGhlIG9yaWdpbmFsIGZpbGUgInswfSIgaGFzIGJlZW4gZGVsZXRlZC4KK0NvbXJlbERpYWdyYW1FZGl0b3JfU2F2ZUFzRXJyb3JUaXRsZT1Qcm9ibGVtIER1cmluZyBTYXZlIEFzLi4uCitDb21yZWxEaWFncmFtRWRpdG9yX1NhdmVBc0Vycm9yTWVzc2FnZT1TYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIFRhcmdldCBmaWxlIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGVkaXRvci4KK0NvbXJlbERpYWdyYW1FZGl0b3JfU2F2ZUVycm9yVGl0bGU9U2F2ZSBQcm9ibGVtcworQ29tcmVsRGlhZ3JhbUVkaXRvcl9TYXZlRXJyb3JNZXNzYWdlPUNvdWxkIG5vdCBzYXZlIGZpbGUuCitDb21yZWxFbGVtZW50Q2hvb3NlckRpYWxvZ19TZWxlY3RNb2RlbEVsZW1lbnRUaXRsZT1TZWxlY3QgbW9kZWwgZWxlbWVudAorTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZU1lc3NhZ2U9U2VsZWN0IG1vZGVsIGVsZW1lbnQ6CitWYWxpZGF0ZUFjdGlvbk1lc3NhZ2U9VmFsaWRhdGUKK09iamVjdHMxR3JvdXBfdGl0bGU9T2JqZWN0cworQ29ubmVjdGlvbnMyR3JvdXBfdGl0bGU9Q29ubmVjdGlvbnMKK0F0b21pY1VuaXQxQ3JlYXRpb25Ub29sX3RpdGxlPUF0b21pY1VuaXQKK0F0b21pY1VuaXQxQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBBdG9taWNVbml0CitDYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0aW9uVG9vbF90aXRsZT1DYXJ0ZXNpYW5RdWV1ZWRVbml0CitDYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdAorQ29uZGl0aW9uQ2hlY2szQ3JlYXRpb25Ub29sX3RpdGxlPUNvbmRpdGlvbkNoZWNrCitDb25kaXRpb25DaGVjazNDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IENvbmRpdGlvbkNoZWNrCitDb25kaXRpb25hbFVuaXQ0Q3JlYXRpb25Ub29sX3RpdGxlPUNvbmRpdGlvbmFsVW5pdAorQ29uZGl0aW9uYWxVbml0NENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQ29uZGl0aW9uYWxVbml0CitNdWx0aUZlYXR1cmVVbml0NUNyZWF0aW9uVG9vbF90aXRsZT1NdWx0aUZlYXR1cmVVbml0CitNdWx0aUZlYXR1cmVVbml0NUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgTXVsdGlGZWF0dXJlVW5pdAorTXVsdGlGaWx0ZXJVbml0NkNyZWF0aW9uVG9vbF90aXRsZT1NdWx0aUZpbHRlclVuaXQKK011bHRpRmlsdGVyVW5pdDZDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE11bHRpRmlsdGVyVW5pdAorTXVsdGlJbnB1dFBvcnQ3Q3JlYXRpb25Ub29sX3RpdGxlPU11bHRpSW5wdXRQb3J0CitNdWx0aUlucHV0UG9ydDdDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE11bHRpSW5wdXRQb3J0CitNdWx0aU91dHB1dFBvcnQ4Q3JlYXRpb25Ub29sX3RpdGxlPU11bHRpT3V0cHV0UG9ydAorTXVsdGlPdXRwdXRQb3J0OENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgTXVsdGlPdXRwdXRQb3J0CitQYXJhbGxlbFF1ZXVlZFVuaXQ5Q3JlYXRpb25Ub29sX3RpdGxlPVBhcmFsbGVsUXVldWVkVW5pdAorUGFyYWxsZWxRdWV1ZWRVbml0OUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0CitTZXF1ZW50aWFsVW5pdDEwQ3JlYXRpb25Ub29sX3RpdGxlPVNlcXVlbnRpYWxVbml0CitTZXF1ZW50aWFsVW5pdDEwQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBTZXF1ZW50aWFsVW5pdAorU2luZ2xlRmVhdHVyZVVuaXQxMUNyZWF0aW9uVG9vbF90aXRsZT1TaW5nbGVGZWF0dXJlVW5pdAorU2luZ2xlRmVhdHVyZVVuaXQxMUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2luZ2xlRmVhdHVyZVVuaXQKK1NpbmdsZUZpbHRlclVuaXQxMkNyZWF0aW9uVG9vbF90aXRsZT1TaW5nbGVGaWx0ZXJVbml0CitTaW5nbGVGaWx0ZXJVbml0MTJDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFNpbmdsZUZpbHRlclVuaXQKK1NpbmdsZUlucHV0UG9ydDEzQ3JlYXRpb25Ub29sX3RpdGxlPVNpbmdsZUlucHV0UG9ydAorU2luZ2xlSW5wdXRQb3J0MTNDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFNpbmdsZUlucHV0UG9ydAorU2luZ2xlT3V0cHV0UG9ydDE0Q3JlYXRpb25Ub29sX3RpdGxlPVNpbmdsZU91dHB1dFBvcnQKK1NpbmdsZU91dHB1dFBvcnQxNENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2luZ2xlT3V0cHV0UG9ydAorU2luZ2xlUXVldWVkVW5pdDE1Q3JlYXRpb25Ub29sX3RpdGxlPVNpbmdsZVF1ZXVlZFVuaXQKK1NpbmdsZVF1ZXVlZFVuaXQxNUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2luZ2xlUXVldWVkVW5pdAorTXVsdGlQb3J0TWFwcGluZzFDcmVhdGlvblRvb2xfdGl0bGU9TXVsdGlQb3J0TWFwcGluZworTXVsdGlQb3J0TWFwcGluZzFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE11bHRpUG9ydE1hcHBpbmcKK011bHRpU2luZ2xlUG9ydE1hcHBpbmcyQ3JlYXRpb25Ub29sX3RpdGxlPU11bHRpU2luZ2xlUG9ydE1hcHBpbmcKK011bHRpU2luZ2xlUG9ydE1hcHBpbmcyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nCitTaW5nbGVQb3J0TWFwcGluZzNDcmVhdGlvblRvb2xfdGl0bGU9U2luZ2xlUG9ydE1hcHBpbmcKK1NpbmdsZVBvcnRNYXBwaW5nM0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2luZ2xlUG9ydE1hcHBpbmcKK0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPUNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU9Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50CitDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50CitQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU9UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU9UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50CitDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU9Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU9Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50CitTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPVNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudAorQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlPUNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlPUNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudAorU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1TZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1TZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudAorQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlPUNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlPUNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudAorQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlPUNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlPUNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudAorUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZT1QYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50CitQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlPVBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZT1QYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQKK1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQKK1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU9UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlPVBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudAorU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlPVNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50CitQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlPVBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZT1QYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU9Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50CitDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU9Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU9Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50CitQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlPVBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZT1QYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQKK1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQKK1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQKK1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlPVNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZT1TZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudAorU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlPVNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlPVNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQKK1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZT1TaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQKK1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlPVNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydF90aXRsZT1TZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudAorU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU9U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlPVNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU9Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQKK1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlPVNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZT1TZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZT1Db25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQKK1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU9UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlPVBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudAorU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlPVNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlPVNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudAorU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU9U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50CitTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlPVNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50CitDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQKK0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU9Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudAorQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlPUNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudAorCitDb21tYW5kTmFtZV9PcGVuRGlhZ3JhbT1PcGVuIERpYWdyYW0KK05hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDE3X2luY29taW5nbGlua3M9aW5jb21pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDE3X291dGdvaW5nbGlua3M9b3V0Z29pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAzNV9pbmNvbWluZ2xpbmtzPWluY29taW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMzVfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMzJfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMzJfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDEzX2luY29taW5nbGlua3M9aW5jb21pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAxM19vdXRnb2luZ2xpbmtzPW91dGdvaW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAyNF9pbmNvbWluZ2xpbmtzPWluY29taW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAyNF9vdXRnb2luZ2xpbmtzPW91dGdvaW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlQb3J0TWFwcGluZ180MDAyX3RhcmdldD10YXJnZXQKK05hdmlnYXRvckdyb3VwTmFtZV9NdWx0aVBvcnRNYXBwaW5nXzQwMDJfc291cmNlPXNvdXJjZQorTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMjBfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMjBfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZU91dHB1dFBvcnRfMzAxOF9vdXRnb2luZ2xpbmtzPW91dGdvaW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMV90YXJnZXQ9dGFyZ2V0CitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMV9zb3VyY2U9c291cmNlCitOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAxMF9pbmNvbWluZ2xpbmtzPWluY29taW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAxMF9vdXRnb2luZ2xpbmtzPW91dGdvaW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMjNfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDIzX291dGdvaW5nbGlua3M9b3V0Z29pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9NdWx0aU91dHB1dFBvcnRfMzAxNV9vdXRnb2luZ2xpbmtzPW91dGdvaW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlT3V0cHV0UG9ydF8zMDExX291dGdvaW5nbGlua3M9b3V0Z29pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAwNV9pbmNvbWluZ2xpbmtzPWluY29taW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDVfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMDJfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMDJfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMDZfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMDZfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDMxX2luY29taW5nbGlua3M9aW5jb21pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAzMV9vdXRnb2luZ2xpbmtzPW91dGdvaW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlPdXRwdXRQb3J0XzMwMjFfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8yMDAxX2luY29taW5nbGlua3M9aW5jb21pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMjAwMV9vdXRnb2luZ2xpbmtzPW91dGdvaW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDlfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDA5X291dGdvaW5nbGlua3M9b3V0Z29pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9Db21wb3NpdGVSZWZhY3RvcmluZ18xMDAwX2xpbmtzPWxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMjdfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDI3X291dGdvaW5nbGlua3M9b3V0Z29pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAwMV9pbmNvbWluZ2xpbmtzPWluY29taW5nIGxpbmtzCitOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDFfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMjhfaW5jb21pbmdsaW5rcz1pbmNvbWluZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMjhfb3V0Z29pbmdsaW5rcz1vdXRnb2luZyBsaW5rcworTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwM190YXJnZXQ9dGFyZ2V0CitOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzX3NvdXJjZT1zb3VyY2UKK05hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDE0X2luY29taW5nbGlua3M9aW5jb21pbmcgbGlua3MKK05hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDE0X291dGdvaW5nbGlua3M9b3V0Z29pbmcgbGlua3MKK05hdmlnYXRvckFjdGlvblByb3ZpZGVyX09wZW5EaWFncmFtQWN0aW9uTmFtZT1PcGVuIERpYWdyYW0KK0Fic3RyYWN0UGFyc2VyX1VuZXhwZWN0ZWRWYWx1ZVR5cGU9VmFsdWUgb2YgdHlwZSB7MH0gaXMgZXhwZWN0ZWQKK0Fic3RyYWN0UGFyc2VyX1dyb25nU3RyaW5nQ29udmVyc2lvbj1TdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byB7MH0gdmFsdWUKK0Fic3RyYWN0UGFyc2VyX1Vua25vd25MaXRlcmFsPVVua25vd24gbGl0ZXJhbDogezB9CisKK01lc3NhZ2VGb3JtYXRQYXJzZXJfSW52YWxpZElucHV0RXJyb3I9SW52YWxpZCBpbnB1dCBhdCB7MH0KK0NvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJUaXRsZT1TZWxlY3QgZG9tYWluIG1vZGVsIGVsZW1lbnQKK0NvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJNZXNzYWdlPUF2YWlsYWJsZSBkb21haW4gbW9kZWwgZWxlbWVudHM6CitDb21wb3NpdGVVbml0czFHcm91cF90aXRsZT1Db21wb3NpdGUgVW5pdHMKK0F0b21pY1VuaXRzMkdyb3VwX3RpdGxlPUF0b21pYyBVbml0cworRmlsdGVyVW5pdHMzR3JvdXBfdGl0bGU9RmlsdGVyIFVuaXRzCitGZWF0dXJlVW5pdHM0R3JvdXBfdGl0bGU9RmVhdHVyZSBVbml0cworUG9ydHM1R3JvdXBfdGl0bGU9UG9ydHMKK01hcHBpbmdzNkdyb3VwX3RpdGxlPU1hcHBpbmdzCitDYXJ0ZXNpYW5RdWV1ZWRVbml0MUNyZWF0aW9uVG9vbF90aXRsZT1DYXJ0ZXNpYW5RdWV1ZWRVbml0CitDYXJ0ZXNpYW5RdWV1ZWRVbml0MUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdAorQ29uZGl0aW9uQ2hlY2syQ3JlYXRpb25Ub29sX3RpdGxlPUNvbmRpdGlvbkNoZWNrCitDb25kaXRpb25DaGVjazJDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IENvbmRpdGlvbkNoZWNrCitDb25kaXRpb25hbFVuaXQzQ3JlYXRpb25Ub29sX3RpdGxlPUNvbmRpdGlvbmFsVW5pdAorQ29uZGl0aW9uYWxVbml0M0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQ29uZGl0aW9uYWxVbml0CitQYXJhbGxlbFF1ZXVlZFVuaXQ0Q3JlYXRpb25Ub29sX3RpdGxlPVBhcmFsbGVsUXVldWVkVW5pdAorUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0CitTZXF1ZW50aWFsVW5pdDVDcmVhdGlvblRvb2xfdGl0bGU9U2VxdWVudGlhbFVuaXQKK1NlcXVlbnRpYWxVbml0NUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2VxdWVudGlhbFVuaXQKK1NpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRpb25Ub29sX3RpdGxlPVNpbmdsZVF1ZXVlZFVuaXQKK1NpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBTaW5nbGVRdWV1ZWRVbml0CitNdWx0aUZpbHRlclVuaXQxQ3JlYXRpb25Ub29sX3RpdGxlPU11bHRpRmlsdGVyVW5pdAorTXVsdGlGaWx0ZXJVbml0MUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgTXVsdGlGaWx0ZXJVbml0CitTaW5nbGVGaWx0ZXJVbml0MkNyZWF0aW9uVG9vbF90aXRsZT1TaW5nbGVGaWx0ZXJVbml0CitTaW5nbGVGaWx0ZXJVbml0MkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2luZ2xlRmlsdGVyVW5pdAorTXVsdGlGZWF0dXJlVW5pdDFDcmVhdGlvblRvb2xfdGl0bGU9TXVsdGlGZWF0dXJlVW5pdAorTXVsdGlGZWF0dXJlVW5pdDFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE11bHRpRmVhdHVyZVVuaXQKK1NpbmdsZUZlYXR1cmVVbml0MkNyZWF0aW9uVG9vbF90aXRsZT1TaW5nbGVGZWF0dXJlVW5pdAorU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBTaW5nbGVGZWF0dXJlVW5pdAorTXVsdGlJbnB1dFBvcnQxQ3JlYXRpb25Ub29sX3RpdGxlPU11bHRpSW5wdXRQb3J0CitNdWx0aUlucHV0UG9ydDFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE11bHRpSW5wdXRQb3J0CitNdWx0aU91dHB1dFBvcnQyQ3JlYXRpb25Ub29sX3RpdGxlPU11bHRpT3V0cHV0UG9ydAorTXVsdGlPdXRwdXRQb3J0MkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgTXVsdGlPdXRwdXRQb3J0CitTaW5nbGVJbnB1dFBvcnQzQ3JlYXRpb25Ub29sX3RpdGxlPVNpbmdsZUlucHV0UG9ydAorU2luZ2xlSW5wdXRQb3J0M0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2luZ2xlSW5wdXRQb3J0CitTaW5nbGVPdXRwdXRQb3J0NENyZWF0aW9uVG9vbF90aXRsZT1TaW5nbGVPdXRwdXRQb3J0CitTaW5nbGVPdXRwdXRQb3J0NENyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgU2luZ2xlT3V0cHV0UG9ydApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzU5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMjYgQEAKK3BsdWdpbk5hbWU9Q29tcmVsIFBsdWdpbgorcHJvdmlkZXJOYW1lPVNhbXBsZSBQbHVnaW4gUHJvdmlkZXIsIEluYworCitlZGl0b3JOYW1lPUNvbXJlbCBEaWFncmFtIEVkaXRpbmcKK2NvbnRleHQuZGVzY3JpcHRpb249Q29tcmVsIERpYWdyYW0gRWRpdGluZworY29udGV4dC5uYW1lPUluIENvbXJlbCBEaWFncmFtIEVkaXRvcgorbmV3V2l6YXJkTmFtZT1Db21yZWwgRGlhZ3JhbQorbmV3V2l6YXJkRGVzYz1DcmVhdGVzIENvbXJlbCBkaWFncmFtLgorCitpbml0RGlhZ3JhbUFjdGlvbkxhYmVsPUluaXRpYWxpemUgY29tcmVsX2RpYWdyYW0gZGlhZ3JhbSBmaWxlCisKKworbmF2aWdhdG9yQ29udGVudE5hbWU9Ki5jb21yZWxfZGlhZ3JhbSBkaWFncmFtIGNvbnRlbnRzCitkb21haW5OYXZpZ2F0b3JDb250ZW50TmFtZT0qLmNvbXJlbCBtb2RlbCBjb250ZW50cwordXBkYXRlLmRpYWdyYW0ubmFtZT1VcGRhdGUgQ29tcmVsIGRpYWdyYW0KK3VwZGF0ZS5kaWFncmFtLmRlc2NyaXB0aW9uPVBlcmZvcm0gQ29tcmVsIGRpYWdyYW0gdXBkYXRlCisKKworIyBQcm9wZXJ0eSBTaGVldAordGFiLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQordGFiLmRpYWdyYW09UnVsZXJzICYgR3JpZAordGFiLmRvbWFpbj1Db3JlCisKKyMgUHJlZmVyZW5jZXMKK3ByZWZwYWdlLmNvbXJlbC5kaWFncmFtLmdlbmVyYWw9Q29tcmVsIERpYWdyYW0KK3ByZWZwYWdlLmNvbXJlbC5kaWFncmFtLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQorcHJlZnBhZ2UuY29tcmVsLmRpYWdyYW0uY29ubmVjdGlvbnM9Q29ubmVjdGlvbnMKK3ByZWZwYWdlLmNvbXJlbC5kaWFncmFtLnByaW50aW5nPVByaW50aW5nCitwcmVmcGFnZS5jb21yZWwuZGlhZ3JhbS5ydWxlcnNBbmRHcmlkPVJ1bGVycyBBbmQgR3JpZAorCisKKyMgUHJvdmlkZXJzCittZXRhdHlwZS5uYW1lLkNvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDA9VW5kZWZpbmVkCittZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8yMDAxPVNpbmdsZUlucHV0UG9ydAorbWV0YXR5cGUubmFtZS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDI9Q2FydGVzaWFuUXVldWVkVW5pdAorbWV0YXR5cGUubmFtZS5QYXJhbGxlbFF1ZXVlZFVuaXRfMjAwMz1QYXJhbGxlbFF1ZXVlZFVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8yMDA0PVNpbmdsZVF1ZXVlZFVuaXQKK21ldGF0eXBlLm5hbWUuU2VxdWVudGlhbFVuaXRfMjAwNT1TZXF1ZW50aWFsVW5pdAorbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMjAwNj1Db25kaXRpb25hbFVuaXQKK21ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8yMDA3PUF0b21pY1VuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlSW5wdXRQb3J0XzMwMDE9U2luZ2xlSW5wdXRQb3J0CittZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMDI9TXVsdGlJbnB1dFBvcnQKK21ldGF0eXBlLm5hbWUuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzPUNhcnRlc2lhblF1ZXVlZFVuaXQKK21ldGF0eXBlLm5hbWUuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQ9UGFyYWxsZWxRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8zMDA1PVNpbmdsZUlucHV0UG9ydAorbWV0YXR5cGUubmFtZS5NdWx0aUlucHV0UG9ydF8zMDA2PU11bHRpSW5wdXRQb3J0CittZXRhdHlwZS5uYW1lLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNz1DYXJ0ZXNpYW5RdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwMDg9U2luZ2xlRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlSW5wdXRQb3J0XzMwMDk9U2luZ2xlSW5wdXRQb3J0CittZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMTA9TXVsdGlJbnB1dFBvcnQKK21ldGF0eXBlLm5hbWUuU2luZ2xlT3V0cHV0UG9ydF8zMDExPVNpbmdsZU91dHB1dFBvcnQKK21ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDEyPU11bHRpRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlSW5wdXRQb3J0XzMwMTM9U2luZ2xlSW5wdXRQb3J0CittZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMTQ9TXVsdGlJbnB1dFBvcnQKK21ldGF0eXBlLm5hbWUuTXVsdGlPdXRwdXRQb3J0XzMwMTU9TXVsdGlPdXRwdXRQb3J0CittZXRhdHlwZS5uYW1lLlNpbmdsZUZpbHRlclVuaXRfMzAxNj1TaW5nbGVGaWx0ZXJVbml0CittZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMTc9TXVsdGlJbnB1dFBvcnQKK21ldGF0eXBlLm5hbWUuU2luZ2xlT3V0cHV0UG9ydF8zMDE4PVNpbmdsZU91dHB1dFBvcnQKK21ldGF0eXBlLm5hbWUuTXVsdGlGaWx0ZXJVbml0XzMwMTk9TXVsdGlGaWx0ZXJVbml0CittZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMjA9TXVsdGlJbnB1dFBvcnQKK21ldGF0eXBlLm5hbWUuTXVsdGlPdXRwdXRQb3J0XzMwMjE9TXVsdGlPdXRwdXRQb3J0CittZXRhdHlwZS5uYW1lLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMj1TaW5nbGVRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8zMDIzPVNpbmdsZUlucHV0UG9ydAorbWV0YXR5cGUubmFtZS5NdWx0aUlucHV0UG9ydF8zMDI0PU11bHRpSW5wdXRQb3J0CittZXRhdHlwZS5uYW1lLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNT1DYXJ0ZXNpYW5RdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwMjY9U2VxdWVudGlhbFVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlSW5wdXRQb3J0XzMwMjc9U2luZ2xlSW5wdXRQb3J0CittZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMjg9TXVsdGlJbnB1dFBvcnQKK21ldGF0eXBlLm5hbWUuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5PUNhcnRlc2lhblF1ZXVlZFVuaXQKK21ldGF0eXBlLm5hbWUuQ29uZGl0aW9uYWxVbml0XzMwMzA9Q29uZGl0aW9uYWxVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8zMDMxPVNpbmdsZUlucHV0UG9ydAorbWV0YXR5cGUubmFtZS5NdWx0aUlucHV0UG9ydF8zMDMyPU11bHRpSW5wdXRQb3J0CittZXRhdHlwZS5uYW1lLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAzMz1DYXJ0ZXNpYW5RdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLkF0b21pY1VuaXRfMzAzND1BdG9taWNVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8zMDM1PVNpbmdsZUlucHV0UG9ydAorbWV0YXR5cGUubmFtZS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNj1QYXJhbGxlbFF1ZXVlZFVuaXQKK21ldGF0eXBlLm5hbWUuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzc9UGFyYWxsZWxRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwMzg9U2luZ2xlRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDM5PU11bHRpRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlRmlsdGVyVW5pdF8zMDQwPVNpbmdsZUZpbHRlclVuaXQKK21ldGF0eXBlLm5hbWUuTXVsdGlGaWx0ZXJVbml0XzMwNDE9TXVsdGlGaWx0ZXJVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZVF1ZXVlZFVuaXRfMzA0Mj1TaW5nbGVRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQzPVBhcmFsbGVsUXVldWVkVW5pdAorbWV0YXR5cGUubmFtZS5TZXF1ZW50aWFsVW5pdF8zMDQ0PVNlcXVlbnRpYWxVbml0CittZXRhdHlwZS5uYW1lLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1PVBhcmFsbGVsUXVldWVkVW5pdAorbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzA0Nj1Db25kaXRpb25hbFVuaXQKK21ldGF0eXBlLm5hbWUuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3PUNhcnRlc2lhblF1ZXVlZFVuaXQKK21ldGF0eXBlLm5hbWUuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDg9UGFyYWxsZWxRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLkF0b21pY1VuaXRfMzA0OT1BdG9taWNVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwNTA9U2luZ2xlRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDUxPU11bHRpRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlRmlsdGVyVW5pdF8zMDUyPVNpbmdsZUZpbHRlclVuaXQKK21ldGF0eXBlLm5hbWUuTXVsdGlGaWx0ZXJVbml0XzMwNTM9TXVsdGlGaWx0ZXJVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZVF1ZXVlZFVuaXRfMzA1ND1TaW5nbGVRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwNTU9U2luZ2xlRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDU2PU11bHRpRmVhdHVyZVVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlRmlsdGVyVW5pdF8zMDU3PVNpbmdsZUZpbHRlclVuaXQKK21ldGF0eXBlLm5hbWUuTXVsdGlGaWx0ZXJVbml0XzMwNTg9TXVsdGlGaWx0ZXJVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZVF1ZXVlZFVuaXRfMzA1OT1TaW5nbGVRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNjA9U2VxdWVudGlhbFVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlRmVhdHVyZVVuaXRfMzA2MT1TaW5nbGVGZWF0dXJlVW5pdAorbWV0YXR5cGUubmFtZS5NdWx0aUZlYXR1cmVVbml0XzMwNjI9TXVsdGlGZWF0dXJlVW5pdAorbWV0YXR5cGUubmFtZS5TaW5nbGVGaWx0ZXJVbml0XzMwNjM9U2luZ2xlRmlsdGVyVW5pdAorbWV0YXR5cGUubmFtZS5NdWx0aUZpbHRlclVuaXRfMzA2ND1NdWx0aUZpbHRlclVuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8zMDY1PVNpbmdsZVF1ZXVlZFVuaXQKK21ldGF0eXBlLm5hbWUuQ29uZGl0aW9uYWxVbml0XzMwNjY9Q29uZGl0aW9uYWxVbml0CittZXRhdHlwZS5uYW1lLlNpbmdsZVF1ZXVlZFVuaXRfMzA2Nz1TaW5nbGVRdWV1ZWRVbml0CittZXRhdHlwZS5uYW1lLkF0b21pY1VuaXRfMzA2OD1BdG9taWNVbml0CittZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNjk9U2VxdWVudGlhbFVuaXQKK21ldGF0eXBlLm5hbWUuU2VxdWVudGlhbFVuaXRfMzA3MD1TZXF1ZW50aWFsVW5pdAorbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzA3MT1Db25kaXRpb25hbFVuaXQKK21ldGF0eXBlLm5hbWUuQ29uZGl0aW9uYWxVbml0XzMwNzI9Q29uZGl0aW9uYWxVbml0CittZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNzM9U2VxdWVudGlhbFVuaXQKK21ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8zMDc0PUF0b21pY1VuaXQKK21ldGF0eXBlLm5hbWUuQ29uZGl0aW9uYWxVbml0XzMwNzU9Q29uZGl0aW9uYWxVbml0CittZXRhdHlwZS5uYW1lLkNvbmRpdGlvbkNoZWNrXzMwNzY9Q29uZGl0aW9uQ2hlY2sKK21ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8zMDc3PUF0b21pY1VuaXQKK21ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8zMDc4PUF0b21pY1VuaXQKK21ldGF0eXBlLm5hbWUuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMT1TaW5nbGVQb3J0TWFwcGluZworbWV0YXR5cGUubmFtZS5NdWx0aVBvcnRNYXBwaW5nXzQwMDI9TXVsdGlQb3J0TWFwcGluZworbWV0YXR5cGUubmFtZS5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDM9TXVsdGlTaW5nbGVQb3J0TWFwcGluZworCisjIENvbW1hbmRzIGFuZCBtZW51IGFjdGlvbnMKK2NtZGNhdGVnb3J5Lm5hbWU9Q29tcmVsIEVkaXRvciBDb21tYW5kcworY21kY2F0ZWdvcnkuZGVzYz1Db21yZWwgRWRpdG9yIENvbW1hbmRzCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3ZjljYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMTQzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKzwhLS0KKworLS0+Cis8cGx1Z2luPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIiBpZD0icmVwby1mdHlwZSI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxmaWxlVHlwZXMgdHlwZT0idGV4dCIgZXh0ZW5zaW9uPSJjb21yZWxfZGlhZ3JhbSIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIiBpZD0icmVzb3VyY2UtZmFjdG9yeSI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxwYXJzZXIKKyAgICAgICAgIHR5cGU9ImNvbXJlbF9kaWFncmFtIgorICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3RvcnkiPgorICAgICAgPC9wYXJzZXI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIgaWQ9ImdtZi1lZGl0b3IiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8ZWRpdG9yCisgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9ySUQiCisgICAgICAgICBuYW1lPSIlZWRpdG9yTmFtZSIKKyAgICAgICAgIGljb249Imljb25zL29iajE2L0NvbXJlbERpYWdyYW1GaWxlLmdpZiIKKyAgICAgICAgIGV4dGVuc2lvbnM9ImNvbXJlbF9kaWFncmFtIgorICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKKyAgICAgICAgIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3IiCisgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE1hdGNoaW5nU3RyYXRlZ3kiCisgICAgICAgICBjb250cmlidXRvckNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciI+CisgICAgICA8L2VkaXRvcj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyIgaWQ9InVpLWNvbnRleHQiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8Y29udGV4dAorICAgICAgICAgZGVzY3JpcHRpb249IiVjb250ZXh0LmRlc2NyaXB0aW9uIgorICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLnVpLmRpYWdyYW1Db250ZXh0IgorICAgICAgICAgbmFtZT0iJWNvbnRleHQubmFtZSIKKyAgICAgICAgIHBhcmVudElkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmRpYWdyYW1Db250ZXh0Ij4KKyAgICAgIDwvY29udGV4dD4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIiBpZD0iY3JlYXRpb24td2l6YXJkIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAJICA8d2l6YXJkCisgIAkgICAgIG5hbWU9IkNvTVJlTCBkaWFncmFtIgorICAJICAgICBpY29uPSJpY29ucy9vYmoxNi9Db21yZWxEaWFncmFtRmlsZS5naWYiCisgIAkgICAgIGNhdGVnb3J5PSJjb21yZWwuZ2VuZXJhdG9yLmNhdGVnb3J5IgorICAJICAgICBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxDcmVhdGlvbldpemFyZCIKKyAgCSAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsQ3JlYXRpb25XaXphcmRJRCI+CisgIAkgIAkgPGRlc2NyaXB0aW9uPiVuZXdXaXphcmREZXNjPC9kZXNjcmlwdGlvbj4gIAorICAgICAgPC93aXphcmQ+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyIgaWQ9ImluaXQtZGlhZ3JhbS1hY3Rpb24iPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCisgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uSW5pdERpYWdyYW0iCisgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmNvbXJlbCIKKyAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+CisgICAgICAgICA8YWN0aW9uCisgICAgICAgICAgICAgICBsYWJlbD0iJWluaXREaWFncmFtQWN0aW9uTGFiZWwiCisgICAgICAgICAgICAgICBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxJbml0RGlhZ3JhbUZpbGVBY3Rpb24iCisgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgorICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5Jbml0RGlhZ3JhbUFjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisJCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcnMiIGlkPSJnbG9iYWwtYWN0aW9ucyI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKKyAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgorICAgICAgICAgaWQ9IkNvbXJlbFByZXNlbnRhdGlvbiI+CisgICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+CisgICAgICAgICA8Vmlld0lkIGlkPSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JJRCI+CisgICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+CisgICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImRlbGV0ZSIvPgorICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KKyAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0ic2F2ZSIvPgorICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgIDwvVmlld0lkPgorICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+CisgICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCisgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1XaXRoUHJpbnRHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCisgICAgICAgICBpZD0iQ29tcmVsUHJlc2VudGF0aW9uUHJpbnQiPgorICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgorICAgICAgICAgPFZpZXdJZCBpZD0iY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9ySUQiPgorICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgorICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwcmludCIvPgorICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgIDwvVmlld0lkPgorICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+CisgICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCisgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLnByb3ZpZGVycy5EaWFncmFtSURFR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgorICAgICAgICAgaWQ9IkNvbXJlbFByZXNlbnRhdGlvbklERSI+CisgICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+CisgICAgICAgICA8Vmlld0lkIGlkPSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JJRCI+CisgICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+CisgICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImJvb2ttYXJrIi8+CisgICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgorICAgICAgICAgPC9WaWV3SWQ+CisgICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KKyAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVVJUmVuZGVyR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgorICAgICAgICAgICAgaWQ9IkNvbXJlbFJlbmRlciI+CisgICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+CisgICAgICAgICA8Vmlld0lkIGlkPSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JJRCI+CisgICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+CisgICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImN1dCIvPgorICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjb3B5Ii8+CisgICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InBhc3RlIi8+CisgICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgorICAgICAgICAgPC9WaWV3SWQ+CisgICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KKyAgIDwvZXh0ZW5zaW9uPgorCisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5tYXJrZXJOYXZpZ2F0aW9uUHJvdmlkZXJzIiBpZD0ibWFya2Vycy1uYXZpZ2F0aW9uIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgICAgPE1hcmtlck5hdmlnYXRpb25Qcm92aWRlciBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbE1hcmtlck5hdmlnYXRpb25Qcm92aWRlciI+CisgICAgICAgICA8TWFya2VyVHlwZSBuYW1lPSJjb21yZWwuZGlhZ3JhbS5kaWFnbm9zdGljIi8+CisgICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+CisgICAgICA8L01hcmtlck5hdmlnYXRpb25Qcm92aWRlcj4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIGlkPSJkaWFnbm9zdGljIiBuYW1lPSJDb21yZWwgUGx1Z2luIHByb2JsZW1zIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+CisgICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLm1hcmtlciIvPgorICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKyAgIDwvZXh0ZW5zaW9uPiAgIAorCisgICA8ZXh0ZW5zaW9uIGlkPSJ2YWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXIiIG5hbWU9IlZhbGlkYXRpb25EZWNvcmF0aW9ucyIgcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZGVjb3JhdG9yUHJvdmlkZXJzIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgICAgPGRlY29yYXRvclByb3ZpZGVyIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsVmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyIj4KKyAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KKyAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aSkiIGlkPSJQUklNQVJZX1ZJRVciLz4KKyAgICAgICAgIDxjb250ZXh0IGRlY29yYXRvclRhcmdldHM9IlBSSU1BUllfVklFVyIvPgorICAgICAgPC9kZWNvcmF0b3JQcm92aWRlcj4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiIGlkPSJwcmVmcyI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxpbml0aWFsaXplciBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucHJlZmVyZW5jZXMuRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyIgaWQ9InByZWZwYWdlcyI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxwYWdlCisgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uZ2VuZXJhbCIKKyAgICAgICAgICAgIG5hbWU9IiVwcmVmcGFnZS5jb21yZWwuZGlhZ3JhbS5nZW5lcmFsIgorICAgICAgICAgICAgY2xhc3M9ImNvbXJlbC5kaWFncmFtLnByZWZlcmVuY2VzLkRpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UiPgorICAgICAgPC9wYWdlPgorICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5hcHBlYXJhbmNlIgorICAgICAgICAgICAgbmFtZT0iJXByZWZwYWdlLmNvbXJlbC5kaWFncmFtLmFwcGVhcmFuY2UiCisgICAgICAgICAgICBjYXRlZ29yeT0iY29tcmVsLmRpYWdyYW0uZ2VuZXJhbCIKKyAgICAgICAgICAgIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wcmVmZXJlbmNlcy5EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlIj4KKyAgICAgIDwvcGFnZT4KKyAgICAgIDxwYWdlCisgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uY29ubmVjdGlvbnMiCisgICAgICAgICAgICBuYW1lPSIlcHJlZnBhZ2UuY29tcmVsLmRpYWdyYW0uY29ubmVjdGlvbnMiCisgICAgICAgICAgICBjYXRlZ29yeT0iY29tcmVsLmRpYWdyYW0uZ2VuZXJhbCIKKyAgICAgICAgICAgIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wcmVmZXJlbmNlcy5EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSI+CisgICAgICA8L3BhZ2U+CisgICAgICA8cGFnZQorICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLnByaW50aW5nIgorICAgICAgICAgICAgbmFtZT0iJXByZWZwYWdlLmNvbXJlbC5kaWFncmFtLnByaW50aW5nIgorICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbXJlbC5kaWFncmFtLmdlbmVyYWwiCisgICAgICAgICAgICBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucHJlZmVyZW5jZXMuRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UiPgorICAgICAgPC9wYWdlPgorICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5ydWxlcnNBbmRHcmlkIgorICAgICAgICAgICAgbmFtZT0iJXByZWZwYWdlLmNvbXJlbC5kaWFncmFtLnJ1bGVyc0FuZEdyaWQiCisgICAgICAgICAgICBjYXRlZ29yeT0iY29tcmVsLmRpYWdyYW0uZ2VuZXJhbCIKKyAgICAgICAgICAgIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wcmVmZXJlbmNlcy5EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlIj4KKyAgICAgIDwvcGFnZT4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eUNvbnRyaWJ1dG9yIiBpZD0icHJvcC1jb250cmliIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgICAgPHByb3BlcnR5Q29udHJpYnV0b3IKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9ImNvbXJlbC5kaWFncmFtIgorICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0iY29tcmVsLmRpYWdyYW0uc2hlZXQuQ29tcmVsU2hlZXRMYWJlbFByb3ZpZGVyIj4KKyAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJkb21haW4iLz4KKyAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJ2aXN1YWwiLz4KKyAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJleHRyYSIvPgorICAgICAgPC9wcm9wZXJ0eUNvbnRyaWJ1dG9yPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5VGFicyIgaWQ9InByb3B0YWJzIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PiAgIAorICAgICAgPHByb3BlcnR5VGFicyBjb250cmlidXRvcklkPSJjb21yZWwuZGlhZ3JhbSI+CisgICAgICAgICA8cHJvcGVydHlUYWIKKyAgICAgICAgICAgICBjYXRlZ29yeT0idmlzdWFsIgorICAgICAgICAgICAgIGlkPSJwcm9wZXJ0eS50YWIuQXBwZWFyYW5jZVByb3BlcnR5U2VjdGlvbiIKKyAgICAgICAgICAgICBsYWJlbD0iJXRhYi5hcHBlYXJhbmNlIi8+CisgICAgICAgICAgPHByb3BlcnR5VGFiCisgICAgICAgICAgICAgY2F0ZWdvcnk9InZpc3VhbCIKKyAgICAgICAgICAgICBpZD0icHJvcGVydHkudGFiLkRpYWdyYW1Qcm9wZXJ0eVNlY3Rpb24iCisgICAgICAgICAgICAgbGFiZWw9IiV0YWIuZGlhZ3JhbSIvPgorICAgICAgICAgIDxwcm9wZXJ0eVRhYgorICAgICAgICAgICAgIGNhdGVnb3J5PSJkb21haW4iCisgICAgICAgICAgICAgaWQ9InByb3BlcnR5LnRhYi5kb21haW4iCisgICAgICAgICAgICAgbGFiZWw9IiV0YWIuZG9tYWluIi8+CisgICAgICA8L3Byb3BlcnR5VGFicz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVNlY3Rpb25zIiBpZD0icHJvcHNlY3Rpb25zIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PiAgIAorICAgICAgPHByb3BlcnR5U2VjdGlvbnMgY29udHJpYnV0b3JJZD0iY29tcmVsLmRpYWdyYW0iPgorICAgICAgICAgPHByb3BlcnR5U2VjdGlvbiBpZD0icHJvcGVydHkuc2VjdGlvbi5Db25uZWN0b3JBcHBlYXJhbmNlUHJvcGVydHlTZWN0aW9uIiAKKyAgICAgICAgICAgIGZpbHRlcj0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzLmZpbHRlcnMuQ29ubmVjdGlvbkVkaXRQYXJ0UHJvcGVydHlTZWN0aW9uRmlsdGVyIiAKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwZWFyYW5jZS5Db25uZWN0aW9uQXBwZWFyYW5jZVByb3BlcnR5U2VjdGlvbiIgCisgICAgICAgICAgICB0YWI9InByb3BlcnR5LnRhYi5BcHBlYXJhbmNlUHJvcGVydHlTZWN0aW9uIj4KKyAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgorICAgICAgICAgPHByb3BlcnR5U2VjdGlvbiBpZD0icHJvcGVydHkuc2VjdGlvbi5TaGFwZUNvbG9yQW5kRm9udFByb3BlcnR5U2VjdGlvbiIgCisgICAgICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvcGVydGllcy5maWx0ZXJzLlNoYXBlRWRpdFBhcnRQcm9wZXJ0eVNlY3Rpb25GaWx0ZXIiIAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvcGVydGllcy5zZWN0aW9ucy5hcHBlYXJhbmNlLlNoYXBlQ29sb3JzQW5kRm9udHNQcm9wZXJ0eVNlY3Rpb24iIAorICAgICAgICAgICAgdGFiPSJwcm9wZXJ0eS50YWIuQXBwZWFyYW5jZVByb3BlcnR5U2VjdGlvbiI+CisgICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCisgICAgICAgICA8cHJvcGVydHlTZWN0aW9uIGlkPSJwcm9wZXJ0eS5zZWN0aW9uLkRpYWdyYW1Db2xvcnNBbmRGb250c1Byb3BlcnR5U2VjdGlvbiIgCisgICAgICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvcGVydGllcy5maWx0ZXJzLkRpYWdyYW1FZGl0UGFydFByb3BlcnR5U2VjdGlvbkZpbHRlciIgCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGVhcmFuY2UuRGlhZ3JhbUNvbG9yc0FuZEZvbnRzUHJvcGVydHlTZWN0aW9uIiAKKyAgICAgICAgICAgIHRhYj0icHJvcGVydHkudGFiLkFwcGVhcmFuY2VQcm9wZXJ0eVNlY3Rpb24iPgorICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAgICAKKyAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24gaWQ9InByb3BlcnR5LnNlY3Rpb24uUnVsZXJHcmlkUHJvcGVydHlTZWN0aW9uIiAKKyAgICAgICAgICAgIGZpbHRlcj0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzLmZpbHRlcnMuRGlhZ3JhbUVkaXRQYXJ0UHJvcGVydHlTZWN0aW9uRmlsdGVyIiAKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3BlcnRpZXMuc2VjdGlvbnMuZ3JpZC5SdWxlckdyaWRQcm9wZXJ0eVNlY3Rpb24iIAorICAgICAgICAgICAgdGFiPSJwcm9wZXJ0eS50YWIuRGlhZ3JhbVByb3BlcnR5U2VjdGlvbiI+CisgICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gICAgIAorICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgorICAgICAgICAgICAgaWQ9InByb3BlcnR5LnNlY3Rpb24uZG9tYWluIiAKKyAgICAgICAgICAgIHRhYj0icHJvcGVydHkudGFiLmRvbWFpbiIKKyAgICAgICAgICAgIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5zaGVldC5Db21yZWxQcm9wZXJ0eVNlY3Rpb24iPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXciLz4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQiLz4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtIi8+CisgICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KKyAgICAgIDwvcHJvcGVydHlTZWN0aW9ucz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudmlld1Byb3ZpZGVycyIgaWQ9InZpZXctcHJvdmlkZXIiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8dmlld1Byb3ZpZGVyIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsVmlld1Byb3ZpZGVyIj4KKyAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KKyAgICAgICAgIDxvYmplY3QgaWQ9InJlZmVyZW5jaW5nLWRpYWdyYW1zIiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSI+CisgICAgICAgICAgICA8bWV0aG9kIG5hbWU9ImdldFR5cGUoKSIgdmFsdWU9ImNvbXJlbCIvPgorICAgICAgICAgPC9vYmplY3Q+CisgICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUiIGNvbnRhaW5lclZpZXdzPSJyZWZlcmVuY2luZy1kaWFncmFtcyIvPgorICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIiBzZW1hbnRpY0hpbnRzPSJDb21yZWwiLz4KKyAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSIgc2VtYW50aWNIaW50cz0iMjAwMSwyMDAyLDIwMDMsMjAwNCwyMDA1LDIwMDYsMjAwNywzMDAxLDMwMDIsMzAwMywzMDA0LDMwMDUsMzAwNiwzMDA3LDMwMDgsMzAwOSwzMDEwLDMwMTEsMzAxMiwzMDEzLDMwMTQsMzAxNSwzMDE2LDMwMTcsMzAxOCwzMDE5LDMwMjAsMzAyMSwzMDIyLDMwMjMsMzAyNCwzMDI1LDMwMjYsMzAyNywzMDI4LDMwMjksMzAzMCwzMDMxLDMwMzIsMzAzMywzMDM0LDMwMzUsMzAzNiwzMDM3LDMwMzgsMzAzOSwzMDQwLDMwNDEsMzA0MiwzMDQzLDMwNDQsMzA0NSwzMDQ2LDMwNDcsMzA0OCwzMDQ5LDMwNTAsMzA1MSwzMDUyLDMwNTMsMzA1NCwzMDU1LDMwNTYsMzA1NywzMDU4LDMwNTksMzA2MCwzMDYxLDMwNjIsMzA2MywzMDY0LDMwNjUsMzA2NiwzMDY3LDMwNjgsMzA2OSwzMDcwLDMwNzEsMzA3MiwzMDczLDMwNzQsMzA3NSwzMDc2LDMwNzcsMzA3OCIvPgorICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlIiBzZW1hbnRpY0hpbnRzPSI0MDAxLDQwMDIsNDAwMyIvPgorICAgICAgPC92aWV3UHJvdmlkZXI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydFByb3ZpZGVycyIgaWQ9ImVwLXByb3ZpZGVyIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgICAgPGVkaXRwYXJ0UHJvdmlkZXIgY2xhc3M9ImNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFZGl0UGFydFByb3ZpZGVyIj4KKyAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KKyAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0iIGlkPSJnZW5lcmF0ZWQtZGlhZ3JhbSI+CisgICAgICAgICAgICA8bWV0aG9kIG5hbWU9ImdldFR5cGUoKSIgdmFsdWU9IkNvbXJlbCIvPgorICAgICAgICAgPC9vYmplY3Q+CisgICAgICAgICA8b2JqZWN0IGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIiBpZD0iZ2VuZXJhdGVkLW5vZGVzIj4KKyAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0iMjAwMSwyMDAyLDIwMDMsMjAwNCwyMDA1LDIwMDYsMjAwNywzMDAxLDMwMDIsMzAwMywzMDA0LDMwMDUsMzAwNiwzMDA3LDMwMDgsMzAwOSwzMDEwLDMwMTEsMzAxMiwzMDEzLDMwMTQsMzAxNSwzMDE2LDMwMTcsMzAxOCwzMDE5LDMwMjAsMzAyMSwzMDIyLDMwMjMsMzAyNCwzMDI1LDMwMjYsMzAyNywzMDI4LDMwMjksMzAzMCwzMDMxLDMwMzIsMzAzMywzMDM0LDMwMzUsMzAzNiwzMDM3LDMwMzgsMzAzOSwzMDQwLDMwNDEsMzA0MiwzMDQzLDMwNDQsMzA0NSwzMDQ2LDMwNDcsMzA0OCwzMDQ5LDMwNTAsMzA1MSwzMDUyLDMwNTMsMzA1NCwzMDU1LDMwNTYsMzA1NywzMDU4LDMwNTksMzA2MCwzMDYxLDMwNjIsMzA2MywzMDY0LDMwNjUsMzA2NiwzMDY3LDMwNjgsMzA2OSwzMDcwLDMwNzEsMzA3MiwzMDczLDMwNzQsMzA3NSwzMDc2LDMwNzcsMzA3OCIvPgorICAgICAgICAgPC9vYmplY3Q+CisgICAgICAgICA8b2JqZWN0IGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlIiBpZD0iZ2VuZXJhdGVkLWxpbmtzIj4KKyAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0iNDAwMSw0MDAyLDQwMDMiLz4KKyAgICAgICAgIDwvb2JqZWN0PgorICAgICAgICAgPG9iamVjdCBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSIgaWQ9ImdlbmVyYXRlZC1sYWJlbHMiPgorICAgICAgICAgICAgPG1ldGhvZCBuYW1lPSJnZXRUeXBlKCkiIHZhbHVlPSI1MDAxLDUwODAsNTA4MSw1MDgyLDUwODMsNTA4NCw1MDg1LDUwMDIsNTAwMyw1MDc5LDUwNzgsNTAwNCw1MDA1LDUwNzcsNTAwOSw1MDA2LDUwMDcsNTAwOCw1MDEzLDUwMTAsNTAxMSw1MDEyLDUwMTYsNTAxNCw1MDE1LDUwMTksNTAxNyw1MDE4LDUwNzYsNTAyMCw1MDIxLDUwNzUsNTA3NCw1MDIyLDUwMjMsNTA3Myw1MDcyLDUwMjQsNTAyNSw1MDI4LDUwMjcsNTAyNiw1MDcxLDUwNzAsNTAyOSw1MDMwLDUwMzEsNTAzMiw1MDY5LDUwNjgsNTA2Nyw1MDY2LDUwNjUsNTAzMyw1MDM1LDUwMzQsNTAzNiw1MDM3LDUwMzgsNTAzOSw1MDY0LDUwNDAsNTA0MSw1MDQyLDUwNDMsNTA2Myw1MDYyLDUwNDQsNTA0NSw1MDQ2LDUwNDcsNTA2MSw1MDYwLDUwNDksNTA0OCw1MDU5LDUwNTgsNTA1Nyw1MDU2LDUwNTEsNTA1MCw1MDU1LDUwNTIsNTA1Myw1MDU0Ii8+CisgICAgICAgICA8L29iamVjdD4KKyAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUiIGlkPSJnZW5lcmF0ZWQtY29tcGFydG1lbnRzIj4KKyAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0iNzAwMSw3MDAyLDcwMDMsNzAwNCw3MDA1LDcwMDYsNzAwNyw3MDA4LDcwMDksNzAxMCw3MDExLDcwMTIsNzAxMyw3MDE0LDcwMTUsNzAxNiw3MDE3LDcwMTgsNzAxOSw3MDIwLDcwMjEsNzAyMiw3MDIzLDcwMjQsNzAyNSw3MDI2LDcwMjcsNzAyOCw3MDI5LDcwMzAsNzAzMSw3MDMyLDcwMzMsNzAzNCw3MDM1LDcwMzYsNzAzNyw3MDM4LDcwMzksNzA0MCw3MDQxLDcwNDIsNzA0Myw3MDQ0LDcwNDUsNzA0Niw3MDQ3LDcwNDgsNzA0OSw3MDUwLDcwNTEsNzA1Miw3MDUzLDcwNTQsNzA1NSw3MDU2LDcwNTcsNzA1OCw3MDU5LDcwNjAsNzA2MSw3MDYyLDcwNjMsNzA2NCw3MDY1LDcwNjYsNzA2Nyw3MDY4LDcwNjksNzA3MCw3MDcxLDcwNzIsNzA3Myw3MDc0LDcwNzUsNzA3Niw3MDc3LDcwNzgsNzA3OSw3MDgwLDcwODEsNzA4Miw3MDgzLDcwODQiLz4KKyAgICAgICAgIDwvb2JqZWN0PgorICAgICAgICAgPGNvbnRleHQgdmlld3M9ImdlbmVyYXRlZC1kaWFncmFtLGdlbmVyYXRlZC1ub2RlcyxnZW5lcmF0ZWQtbGlua3MsZ2VuZXJhdGVkLWxhYmVscyxnZW5lcmF0ZWQtY29tcGFydG1lbnRzIi8+CisgICAgICA8L2VkaXRwYXJ0UHJvdmlkZXI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLm1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJzIiBpZD0ibW9kZWxhc3Npc3QtcHJvdmlkZXIiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8bW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIiPgorICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgorICAgICAgICAgPG9iamVjdCBjbGFzcz0iY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0IiBpZD0iQ29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMCIvPgorICAgICAgICAgPG9iamVjdCBjbGFzcz0iY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnRFZGl0UGFydCIgaWQ9IlNpbmdsZUlucHV0UG9ydF8yMDAxIi8+CisgICAgICAgICA8b2JqZWN0IGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydCIgaWQ9IkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIvPgorICAgICAgICAgPG9iamVjdCBjbGFzcz0iY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydCIgaWQ9IlBhcmFsbGVsUXVldWVkVW5pdF8yMDAzIi8+CisgICAgICAgICA8b2JqZWN0IGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydCIgaWQ9IlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCIvPgorICAgICAgICAgPG9iamVjdCBjbGFzcz0iY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdEVkaXRQYXJ0IiBpZD0iU2VxdWVudGlhbFVuaXRfMjAwNSIvPgorICAgICAgICAgPG9iamVjdCBjbGFzcz0iY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRFZGl0UGFydCIgaWQ9IkNvbmRpdGlvbmFsVW5pdF8yMDA2Ii8+CisgICAgICAgICA8b2JqZWN0IGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXRFZGl0UGFydCIgaWQ9IkF0b21pY1VuaXRfMjAwNyIvPgorICAgICAgICAgPGNvbnRleHQgZWxlbWVudHM9IkNvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDAsU2luZ2xlSW5wdXRQb3J0XzIwMDEsQ2FydGVzaWFuUXVldWVkVW5pdF8yMDAyLFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzLFNpbmdsZVF1ZXVlZFVuaXRfMjAwNCxTZXF1ZW50aWFsVW5pdF8yMDA1LENvbmRpdGlvbmFsVW5pdF8yMDA2LEF0b21pY1VuaXRfMjAwNyIvPgorICAgICAgPC9tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uUHJvdmlkZXJzIiBpZD0iaWNvbi1wcm92aWRlciI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxJY29uUHJvdmlkZXIgY2xhc3M9ImNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxJY29uUHJvdmlkZXIiPgorICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgorICAgICAgPC9JY29uUHJvdmlkZXI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlclByb3ZpZGVycyIgaWQ9InBhcnNlci1wcm92aWRlciI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxQYXJzZXJQcm92aWRlciBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyIj4KKyAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KKyAgICAgIDwvUGFyc2VyUHJvdmlkZXI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5kZWNvcmF0b3JQcm92aWRlcnMiIGlkPSJkZWNvcmF0b3ItcHJvdmlkZXIiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8ZGVjb3JhdG9yUHJvdmlkZXIgY2xhc3M9ImNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxTaG9ydGN1dHNEZWNvcmF0b3JQcm92aWRlciI+CisgICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+CisgICAgICAgICA8b2JqZWN0IGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uKSIgaWQ9ImdlbmVyYXRlZC10b3Atbm9kZXMiPgorICAgICAgICAgICAgPG1ldGhvZCBuYW1lPSJnZXRUeXBlKCkiIHZhbHVlPSIyMDAxLDIwMDIsMjAwMywyMDA0LDIwMDUsMjAwNiwyMDA3Ii8+CisgICAgICAgICA8L29iamVjdD4KKyAgICAgICAgIDxjb250ZXh0IGRlY29yYXRvclRhcmdldHM9ImdlbmVyYXRlZC10b3Atbm9kZXMiLz4KKyAgICAgIDwvZGVjb3JhdG9yUHJvdmlkZXI+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZXMiIGlkPSJlbGVtZW50LXR5cGVzIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPG1ldGFtb2RlbFR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5Db21wb3NpdGVSZWZhY3RvcmluZ18xMDAwIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQ29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCisgICAgICAgICAgICAgICBlY2xhc3M9IkNvbXBvc2l0ZVJlZmFjdG9yaW5nIgorICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0iY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMCIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8bWV0YW1vZGVsVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8yMDAxIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlSW5wdXRQb3J0XzIwMDEiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgorICAgICAgICAgICAgICAgZWNsYXNzPSJTaW5nbGVJbnB1dFBvcnQiCisgICAgICAgICAgICAgICBlZGl0aGVscGVyPSJjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnMuU2luZ2xlSW5wdXRQb3J0RWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMSIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8bWV0YW1vZGVsVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCisgICAgICAgICAgICAgICBlY2xhc3M9IkNhcnRlc2lhblF1ZXVlZFVuaXQiCisgICAgICAgICAgICAgICBlZGl0aGVscGVyPSJjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnMuQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRIZWxwZXIiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjIwMDIiLz4KKyAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlBhcmFsbGVsUXVldWVkVW5pdF8yMDAzIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDAzIi8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVRdWV1ZWRVbml0XzMwMjIiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDA0Ii8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNlcXVlbnRpYWxVbml0XzIwMDUiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TZXF1ZW50aWFsVW5pdF8yMDA1IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNlcXVlbnRpYWxVbml0XzMwMjYiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDA1Ii8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbmFsVW5pdF8yMDA2IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQ29uZGl0aW9uYWxVbml0XzIwMDYiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwMzAiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDA2Ii8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMjAwNyIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLkF0b21pY1VuaXRfMjAwNyIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwMzQiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDA3Ii8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8zMDAxIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlSW5wdXRQb3J0XzMwMDEiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzIwMDEiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDAxIi8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPG1ldGFtb2RlbFR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDAyIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlJbnB1dFBvcnRfMzAwMiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCisgICAgICAgICAgICAgICBlY2xhc3M9Ik11bHRpSW5wdXRQb3J0IgorICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0iY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzLk11bHRpSW5wdXRQb3J0RWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwMiIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDMiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8bWV0YW1vZGVsVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlBhcmFsbGVsUXVldWVkVW5pdF8zMDA0IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgorICAgICAgICAgICAgICAgZWNsYXNzPSJQYXJhbGxlbFF1ZXVlZFVuaXQiCisgICAgICAgICAgICAgICBlZGl0aGVscGVyPSJjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnMuUGFyYWxsZWxRdWV1ZWRVbml0RWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwNCIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMDUiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TaW5nbGVJbnB1dFBvcnRfMzAwNSIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMjAwMSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDUiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlJbnB1dFBvcnRfMzAwNiIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMDYiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlJbnB1dFBvcnRfMzAwMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDYiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMDciLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8bWV0YW1vZGVsVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwMDgiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TaW5nbGVGZWF0dXJlVW5pdF8zMDA4IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iU2luZ2xlRmVhdHVyZVVuaXQiCisgICAgICAgICAgICAgICBlZGl0aGVscGVyPSJjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0SGVscGVyIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDA4Ii8+CisgICAgICAgICA8L21ldGFtb2RlbFR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAwOSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8zMDA5IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8yMDAxIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwOSIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDEwIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlJbnB1dFBvcnRfMzAxMCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDAyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAxMCIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxtZXRhbW9kZWxUeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlT3V0cHV0UG9ydF8zMDExIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlT3V0cHV0UG9ydF8zMDExIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iU2luZ2xlT3V0cHV0UG9ydCIKKyAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9ImNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5TaW5nbGVPdXRwdXRQb3J0RWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAxMSIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8bWV0YW1vZGVsVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCisgICAgICAgICAgICAgICBlY2xhc3M9Ik11bHRpRmVhdHVyZVVuaXQiCisgICAgICAgICAgICAgICBlZGl0aGVscGVyPSJjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnMuTXVsdGlGZWF0dXJlVW5pdEVkaXRIZWxwZXIiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMTIiLz4KKyAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8zMDEzIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlSW5wdXRQb3J0XzMwMTMiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzIwMDEiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDEzIi8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMTQiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5NdWx0aUlucHV0UG9ydF8zMDE0IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMDIiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDE0Ii8+CisgICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPG1ldGFtb2RlbFR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aU91dHB1dFBvcnRfMzAxNSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLk11bHRpT3V0cHV0UG9ydF8zMDE1IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iTXVsdGlPdXRwdXRQb3J0IgorICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0iY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzLk11bHRpT3V0cHV0UG9ydEVkaXRIZWxwZXIiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMTUiLz4KKyAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPG1ldGFtb2RlbFR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVGaWx0ZXJVbml0XzMwMTYiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TaW5nbGVGaWx0ZXJVbml0XzMwMTYiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgorICAgICAgICAgICAgICAgZWNsYXNzPSJTaW5nbGVGaWx0ZXJVbml0IgorICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0iY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzLlNpbmdsZUZpbHRlclVuaXRFZGl0SGVscGVyIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDE2Ii8+CisgICAgICAgICA8L21ldGFtb2RlbFR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDE3IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlJbnB1dFBvcnRfMzAxNyIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDAyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAxNyIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVPdXRwdXRQb3J0XzMwMTgiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TaW5nbGVPdXRwdXRQb3J0XzMwMTgiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlT3V0cHV0UG9ydF8zMDExIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAxOCIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxtZXRhbW9kZWxUeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGaWx0ZXJVbml0XzMwMTkiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5NdWx0aUZpbHRlclVuaXRfMzAxOSIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCisgICAgICAgICAgICAgICBlY2xhc3M9Ik11bHRpRmlsdGVyVW5pdCIKKyAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9ImNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5NdWx0aUZpbHRlclVuaXRFZGl0SGVscGVyIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDE5Ii8+CisgICAgICAgICA8L21ldGFtb2RlbFR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDIwIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlJbnB1dFBvcnRfMzAyMCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDAyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAyMCIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aU91dHB1dFBvcnRfMzAyMSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLk11bHRpT3V0cHV0UG9ydF8zMDIxIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpT3V0cHV0UG9ydF8zMDE1Ii8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAyMSIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxtZXRhbW9kZWxUeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDIyIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8zMDIyIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iU2luZ2xlUXVldWVkVW5pdCIKKyAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9ImNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5TaW5nbGVRdWV1ZWRVbml0RWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAyMiIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMjMiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TaW5nbGVJbnB1dFBvcnRfMzAyMyIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMjAwMSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMjMiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlJbnB1dFBvcnRfMzAyNCIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLk11bHRpSW5wdXRQb3J0XzMwMjQiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlJbnB1dFBvcnRfMzAwMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMjQiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMjUiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8bWV0YW1vZGVsVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNlcXVlbnRpYWxVbml0XzMwMjYiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TZXF1ZW50aWFsVW5pdF8zMDI2IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iU2VxdWVudGlhbFVuaXQiCisgICAgICAgICAgICAgICBlZGl0aGVscGVyPSJjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnMuU2VxdWVudGlhbFVuaXRFZGl0SGVscGVyIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDI2Ii8+CisgICAgICAgICA8L21ldGFtb2RlbFR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAyNyIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8zMDI3IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8yMDAxIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAyNyIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDI4IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlJbnB1dFBvcnRfMzAyOCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDAyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAyOCIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uQ2FydGVzaWFuUXVldWVkVW5pdF8yMDAyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAyOSIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxtZXRhbW9kZWxUeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwMzAiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzAzMCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCisgICAgICAgICAgICAgICBlY2xhc3M9IkNvbmRpdGlvbmFsVW5pdCIKKyAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9ImNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5Db25kaXRpb25hbFVuaXRFZGl0SGVscGVyIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDMwIi8+CisgICAgICAgICA8L21ldGFtb2RlbFR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAzMSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZUlucHV0UG9ydF8zMDMxIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8yMDAxIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAzMSIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDMyIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlJbnB1dFBvcnRfMzAzMiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDAyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAzMiIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uQ2FydGVzaWFuUXVldWVkVW5pdF8yMDAyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAzMyIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxtZXRhbW9kZWxUeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQXRvbWljVW5pdF8zMDM0IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8zMDM0IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iQXRvbWljVW5pdCIKKyAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9ImNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5BdG9taWNVbml0RWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAzNCIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMzUiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5TaW5nbGVJbnB1dFBvcnRfMzAzNSIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMjAwMSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMzUiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMzYiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzciCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMzciLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzAzOCIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwMzgiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMzgiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGZWF0dXJlVW5pdF8zMDM5IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDM5IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwMzkiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDQwIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlRmlsdGVyVW5pdF8zMDQwIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZpbHRlclVuaXRfMzAxNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDAiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGaWx0ZXJVbml0XzMwNDEiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5NdWx0aUZpbHRlclVuaXRfMzA0MSIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzAxOSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDEiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDQyIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8zMDQyIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDIiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDMiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA0NCIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNDQiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzAyNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDQiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDUiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNDYiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzA0NiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5Db25kaXRpb25hbFVuaXRfMzAzMCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDYiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDciLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDgiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDgiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQXRvbWljVW5pdF8zMDQ5IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8zMDQ5IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzAzNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNDkiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzA1MCIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwNTAiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTAiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGZWF0dXJlVW5pdF8zMDUxIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDUxIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTEiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDUyIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlRmlsdGVyVW5pdF8zMDUyIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZpbHRlclVuaXRfMzAxNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTIiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGaWx0ZXJVbml0XzMwNTMiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5NdWx0aUZpbHRlclVuaXRfMzA1MyIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzAxOSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTMiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDU0IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8zMDU0IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTQiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwNTUiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTUiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGZWF0dXJlVW5pdF8zMDU2IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDU2IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTYiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDU3IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlRmlsdGVyVW5pdF8zMDU3IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZpbHRlclVuaXRfMzAxNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTciLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGaWx0ZXJVbml0XzMwNTgiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5NdWx0aUZpbHRlclVuaXRfMzA1OCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzAxOSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTgiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDU5IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8zMDU5IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNTkiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA2MCIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNjAiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzAyNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjAiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzA2MSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjEiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGZWF0dXJlVW5pdF8zMDYyIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlGZWF0dXJlVW5pdF8zMDYyIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjIiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDYzIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlRmlsdGVyVW5pdF8zMDYzIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZpbHRlclVuaXRfMzAxNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjMiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlGaWx0ZXJVbml0XzMwNjQiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5NdWx0aUZpbHRlclVuaXRfMzA2NCIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzAxOSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjQiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDY1IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8zMDY1IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjUiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNjYiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzA2NiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5Db25kaXRpb25hbFVuaXRfMzAzMCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjYiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDY3IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuU2luZ2xlUXVldWVkVW5pdF8zMDY3IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjciLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQXRvbWljVW5pdF8zMDY4IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8zMDY4IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzAzNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjgiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA2OSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNjkiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzAyNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNjkiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA3MCIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNzAiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzAyNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNzAiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNzEiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzA3MSIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5Db25kaXRpb25hbFVuaXRfMzAzMCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNzEiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNzIiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzA3MiIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5Db25kaXRpb25hbFVuaXRfMzAzMCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNzIiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA3MyIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNlcXVlbnRpYWxVbml0XzMwNzMiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzAyNiIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNzMiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQXRvbWljVW5pdF8zMDc0IgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuQXRvbWljVW5pdF8zMDc0IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSI+CisgICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9ImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzAzNCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNzQiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8c3BlY2lhbGl6YXRpb25UeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNzUiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5Db25kaXRpb25hbFVuaXRfMzA3NSIKKyAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiPgorICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJjb21yZWwuZGlhZ3JhbS5Db25kaXRpb25hbFVuaXRfMzAzMCIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjMwNzUiLz4KKyAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vY29tcmVsLzAuMSI+CisgICAgICAgICA8bWV0YW1vZGVsVHlwZQorICAgICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbkNoZWNrXzMwNzYiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5Db25kaXRpb25DaGVja18zMDc2IgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iQ29uZGl0aW9uQ2hlY2siCisgICAgICAgICAgICAgICBlZGl0aGVscGVyPSJjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnMuQ29uZGl0aW9uQ2hlY2tFZGl0SGVscGVyIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDc2Ii8+CisgICAgICAgICA8L21ldGFtb2RlbFR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwNzciCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5BdG9taWNVbml0XzMwNzciCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uQXRvbWljVW5pdF8zMDM0Ii8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzA3NyIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwNzgiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5BdG9taWNVbml0XzMwNzgiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIj4KKyAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0iY29tcmVsLmRpYWdyYW0uQXRvbWljVW5pdF8zMDM0Ii8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzA3OCIvPgorICAgICAgICAgPC9zcGVjaWFsaXphdGlvblR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxtZXRhbW9kZWxUeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSIKKyAgICAgICAgICAgICAgIG5hbWU9IiVtZXRhdHlwZS5uYW1lLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgorICAgICAgICAgICAgICAgZWNsYXNzPSJTaW5nbGVQb3J0TWFwcGluZyIKKyAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9ImNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRIZWxwZXIiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjQwMDEiLz4KKyAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KKyAgICAgIDwvbWV0YW1vZGVsPgorICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL2NvbXJlbC8wLjEiPgorICAgICAgICAgPG1ldGFtb2RlbFR5cGUKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5NdWx0aVBvcnRNYXBwaW5nXzQwMDIiCisgICAgICAgICAgICAgICBuYW1lPSIlbWV0YXR5cGUubmFtZS5NdWx0aVBvcnRNYXBwaW5nXzQwMDIiCisgICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgorICAgICAgICAgICAgICAgZWNsYXNzPSJNdWx0aVBvcnRNYXBwaW5nIgorICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0iY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzLk11bHRpUG9ydE1hcHBpbmdFZGl0SGVscGVyIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSI0MDAyIi8+CisgICAgICAgICA8L21ldGFtb2RlbFR5cGU+CisgICAgICA8L21ldGFtb2RlbD4KKyAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIj4KKyAgICAgICAgIDxtZXRhbW9kZWxUeXBlCisgICAgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzIgorICAgICAgICAgICAgICAgbmFtZT0iJW1ldGF0eXBlLm5hbWUuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzIgorICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKKyAgICAgICAgICAgICAgIGVjbGFzcz0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZyIKKyAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9ImNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdEhlbHBlciI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iNDAwMyIvPgorICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgorICAgICAgPC9tZXRhbW9kZWw+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZUJpbmRpbmdzIiBpZD0iZWxlbWVudC10eXBlcy1iaW5kaW5ncyI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxjbGllbnRDb250ZXh0IGlkPSJjb21yZWwuZGlhZ3JhbS5UeXBlQ29udGV4dCI+CisgICAgICAgICA8ZW5hYmxlbWVudD4KKyAgICAgICAgICAgIDx0ZXN0CisgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuZWRpdGluZ0RvbWFpbiIKKyAgICAgICAgICAgICAgIHZhbHVlPSJjb21yZWwuZGlhZ3JhbS5FZGl0aW5nRG9tYWluIi8+CisgICAgICAgICA8L2VuYWJsZW1lbnQ+CisgICAgICA8L2NsaWVudENvbnRleHQ+IAorICAgICAgPGJpbmRpbmcgY29udGV4dD0iY29tcmVsLmRpYWdyYW0uVHlwZUNvbnRleHQiPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uQ29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzIwMDEiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMjAwNSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzIwMDYiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMjAwNyIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMDEiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMDIiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMyIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8zMDA1Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDA2Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDciLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwMDgiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8zMDA5Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDEwIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVPdXRwdXRQb3J0XzMwMTEiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMTMiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMTQiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpT3V0cHV0UG9ydF8zMDE1Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVGaWx0ZXJVbml0XzMwMTYiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMTciLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZU91dHB1dFBvcnRfMzAxOCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uTXVsdGlGaWx0ZXJVbml0XzMwMTkiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMjAiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpT3V0cHV0UG9ydF8zMDIxIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVRdWV1ZWRVbml0XzMwMjIiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8zMDIzIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDI0Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNlcXVlbnRpYWxVbml0XzMwMjYiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8zMDI3Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDI4Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbmFsVW5pdF8zMDMwIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAzMSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uTXVsdGlJbnB1dFBvcnRfMzAzMiIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwMzQiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8zMDM1Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNiIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzciLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwMzgiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAzOSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDQwIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzA0MSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDQyIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA0NCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbmFsVW5pdF8zMDQ2Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDciLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwNDkiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwNTAiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzA1MSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDUyIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzA1MyIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDU0Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVGZWF0dXJlVW5pdF8zMDU1Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aUZlYXR1cmVVbml0XzMwNTYiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZUZpbHRlclVuaXRfMzA1NyIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uTXVsdGlGaWx0ZXJVbml0XzMwNTgiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzA1OSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA2MCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlRmVhdHVyZVVuaXRfMzA2MSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uTXVsdGlGZWF0dXJlVW5pdF8zMDYyIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVGaWx0ZXJVbml0XzMwNjMiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLk11bHRpRmlsdGVyVW5pdF8zMDY0Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVRdWV1ZWRVbml0XzMwNjUiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbmFsVW5pdF8zMDY2Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TaW5nbGVRdWV1ZWRVbml0XzMwNjciLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzA2OCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA2OSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA3MCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNzEiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbmFsVW5pdF8zMDcyIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5TZXF1ZW50aWFsVW5pdF8zMDczIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwNzQiLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbmFsVW5pdF8zMDc1Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5Db25kaXRpb25DaGVja18zMDc2Ii8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwNzciLz4KKyAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9ImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzA3OCIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSIvPgorICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0iY29tcmVsLmRpYWdyYW0uTXVsdGlQb3J0TWFwcGluZ180MDAyIi8+CisgICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJjb21yZWwuZGlhZ3JhbS5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMiLz4KKyAgICAgICAgIDxhZHZpY2UgcmVmPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuYWR2aWNlLm5vdGF0aW9uRGVwZGVuZGVudHMiLz4KKyAgICAgIDwvYmluZGluZz4KKyAgIDwvZXh0ZW5zaW9uPgorCSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIiBpZD0ibmF2aWdhdG9yLXByb3B0ZXN0LmlzVVJJRWRpdG9ySW5wdXQiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICAgPHByb3BlcnR5VGVzdGVyCisgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5VUklFZGl0b3JJbnB1dFByb3BlcnR5VGVzdGVyIgorICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IgorICAgICAgICAgICBuYW1lc3BhY2U9ImNvbXJlbC5kaWFncmFtIgorICAgICAgICAgICBwcm9wZXJ0aWVzPSJpc1VSSUVkaXRvcklucHV0IgorICAgICAgICAgICBjbGFzcz0iY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxVcmlFZGl0b3JJbnB1dFRlc3RlciI+CisgICAgICAgPC9wcm9wZXJ0eVRlc3Rlcj4KKyAgIDwvZXh0ZW5zaW9uPgorCisJICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiIGlkPSJuYXZpZ2F0b3ItcHJvcHRlc3QuaXNTaG9ydGN1dCI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgICA8cHJvcGVydHlUZXN0ZXIKKyAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLlNob3J0Y3V0UHJvcGVydHlUZXN0ZXIiCisgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXciCisgICAgICAgICAgIG5hbWVzcGFjZT0iY29tcmVsLmRpYWdyYW0iCisgICAgICAgICAgIHByb3BlcnRpZXM9ImlzU2hvcnRjdXQiCisgICAgICAgICAgIGNsYXNzPSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFNob3J0Y3V0UHJvcGVydHlUZXN0ZXIiPgorICAgICAgIDwvcHJvcGVydHlUZXN0ZXI+CisgICA8L2V4dGVuc2lvbj4KKworCSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiIGlkPSJuYXZpZ2F0b3Itdmlld2JpbmRpbmciPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8dmlld2VyQ29udGVudEJpbmRpbmcgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgorICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgPGNvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0iY29tcmVsLmRpYWdyYW0ucmVzb3VyY2VDb250ZW50Ii8+CisJCQk8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJjb21yZWwuZGlhZ3JhbS5kb21haW5SZXNvdXJjZUNvbnRlbnQiLz4KKyAgICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvckxpbmtIZWxwZXIiLz4KKyAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgorICAgICAgPHZpZXdlckFjdGlvbkJpbmRpbmcgdmlld2VySWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgorICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgPGFjdGlvbkV4dGVuc2lvbiBwYXR0ZXJuPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3JBY3Rpb25Qcm92aWRlciIvPgorICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvdmlld2VyQWN0aW9uQmluZGluZz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCIgaWQ9Im5hdmlnYXRvci1jb250ZW50Ij4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgICAgPG5hdmlnYXRvckNvbnRlbnQKKyAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5yZXNvdXJjZUNvbnRlbnQiIAorICAgICAgICAgICAgbmFtZT0iJW5hdmlnYXRvckNvbnRlbnROYW1lIiAKKyAgICAgICAgICAgIHByaW9yaXR5PSJub3JtYWwiIAorICAgICAgICAgICAgY29udGVudFByb3ZpZGVyPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIiAKKyAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvQ29tcmVsRGlhZ3JhbUZpbGUuZ2lmIgorICAgICAgICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIj4KKyAgICAgICAgIDx0cmlnZ2VyUG9pbnRzPgorICAgICAgICAgICAgPG9yPgorCSAgICAgICAgICAgPGFuZD4KKyAgICAJICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIvPgorICAgICAgICAJICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmV4dGVuc2lvbiIgdmFsdWU9ImNvbXJlbF9kaWFncmFtIi8+CisgICAgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtIi8+CisgICAgICAgICAgIAkgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldyI+CisgICAgICAgICAgIAkgICAgICA8dGVzdCBwcm9wZXJ0eT0iY29tcmVsLmRpYWdyYW0uaXNTaG9ydGN1dCIvPgorICAgICAgICAgICAJICAgPC9hZGFwdD4KKyAgICAgICAgICAgIDwvb3I+CisgICAgICAgICA8L3RyaWdnZXJQb2ludHM+CisgICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KKyAgICAgICAgICAgIDxvcj4KKyAgICAgICAgIAkgICA8aW5zdGFuY2VvZiB2YWx1ZT0iY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbSIvPgorICAgICAgICAgICAJICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXciPgorICAgICAgICAgICAJICAgICAgPHRlc3QgcHJvcGVydHk9ImNvbXJlbC5kaWFncmFtLmlzU2hvcnRjdXQiLz4KKyAgICAgICAgICAgCSAgIDwvYWRhcHQ+CisgICAgICAgICAgICA8L29yPgorICAgICAgICAgPC9wb3NzaWJsZUNoaWxkcmVuPgorICAgICAgICAgPGNvbW1vblNvcnRlciAKKyAgICAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3JTb3J0ZXIiIAorICAgICAgICAgICAgICAgY2xhc3M9ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JTb3J0ZXIiPgorICAgICAgICAgICAgPHBhcmVudEV4cHJlc3Npb24+CisgICAgICAgICAgICAgICA8b3I+CisJICAgICAgICAgICAgICA8YW5kPgorICAgIAkgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+CisgICAgICAgIAkgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuZXh0ZW5zaW9uIiB2YWx1ZT0iY29tcmVsX2RpYWdyYW0iLz4KKyAgICAgICAgICAgICAgICAgIDwvYW5kPgorICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0iLz4KKyAgICAgICAgICAgICAgIDwvb3I+CisgICAgICAgICAgICA8L3BhcmVudEV4cHJlc3Npb24+CisgICAgICAgICA8L2NvbW1vblNvcnRlcj4KKyAgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KKyAgICAgIDxuYXZpZ2F0b3JDb250ZW50CisgICAgICAgICAgICBpZD0iY29tcmVsLmRpYWdyYW0uZG9tYWluUmVzb3VyY2VDb250ZW50IiAKKyAgICAgICAgICAgIG5hbWU9IiVkb21haW5OYXZpZ2F0b3JDb250ZW50TmFtZSIgCisgICAgICAgICAgICBwcmlvcml0eT0ibm9ybWFsIiAKKyAgICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0iY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbERvbWFpbk5hdmlnYXRvckNvbnRlbnRQcm92aWRlciIgCisgICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsRG9tYWluTmF2aWdhdG9yTGFiZWxQcm92aWRlciIKKyAgICAgICAgICAgIGljb249Imljb25zL29iajE2L0NvbXJlbERpYWdyYW1GaWxlLmdpZiIKKyAgICAgICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSI+CisgICAgICAgICA8dHJpZ2dlclBvaW50cz4KKyAgICAgICAgICAgIDxvcj4KKwkgICAgICAgICAgIDxhbmQ+CisgICAgCSAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KKyAgICAgICAgCSAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5leHRlbnNpb24iIHZhbHVlPSJjb21yZWwiLz4KKyAgICAgICAgICAgICAgIDwvYW5kPgorICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxEb21haW5OYXZpZ2F0b3JJdGVtIi8+CisgICAgICAgICAgICA8L29yPgorICAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgorICAgICAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+CisgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0iY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbERvbWFpbk5hdmlnYXRvckl0ZW0iLz4KKyAgICAgICAgIDwvcG9zc2libGVDaGlsZHJlbj4KKyAgICAgIDwvbmF2aWdhdG9yQ29udGVudD4KKyAgICAgIDxhY3Rpb25Qcm92aWRlcgorICAgICAgICAgICAgaWQ9ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvckFjdGlvblByb3ZpZGVyIgorICAgICAgICAgICAgY2xhc3M9ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JBY3Rpb25Qcm92aWRlciI+CisgICAgICAgICA8ZW5hYmxlbWVudD4KKyAgICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtIi8+CisgICAgICAgICAgIAkgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldyI+CisgICAgICAgICAgIAkgICAgICA8dGVzdCBwcm9wZXJ0eT0iY29tcmVsLmRpYWdyYW0uaXNTaG9ydGN1dCIvPgorICAgICAgICAgICAJICAgPC9hZGFwdD4KKyAgICAgICAgICAgIDwvb3I+CisgICAgICAgICA8L2VuYWJsZW1lbnQ+CisgICAgICA8L2FjdGlvblByb3ZpZGVyPgorICAgPC9leHRlbnNpb24+CisgICAKKwkgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubGlua0hlbHBlciIgaWQ9Im5hdmlnYXRvci1saW5raGVscGVyIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgICAgPGxpbmtIZWxwZXIKKyAgICAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3JMaW5rSGVscGVyIgorICAgICAgICAgICAgY2xhc3M9ImNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JMaW5rSGVscGVyIj4KKyAgICAgICAgIDxlZGl0b3JJbnB1dEVuYWJsZW1lbnQ+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiLz4KKyAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJjb21yZWwuZGlhZ3JhbS5pc1VSSUVkaXRvcklucHV0Ii8+CisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgIDwvZWRpdG9ySW5wdXRFbmFibGVtZW50PgorICAgICAgICAgPHNlbGVjdGlvbkVuYWJsZW1lbnQ+CisgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0iY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbSIvPgorICAgICAgICAgPC9zZWxlY3Rpb25FbmFibGVtZW50PgorICAgICAgPC9saW5rSGVscGVyPgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyIgaWQ9InVwZGF0ZS1jbWQiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8Y29tbWFuZAorICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKKyAgICAgICAgIGRlZmF1bHRIYW5kbGVyPSJjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVDb21tYW5kIgorICAgICAgICAgZGVzY3JpcHRpb249IiV1cGRhdGUuZGlhZ3JhbS5kZXNjcmlwdGlvbiIKKyAgICAgICAgIGlkPSJjb21yZWwuZGlhZ3JhbS51cGRhdGVEaWFncmFtIgorICAgICAgICAgbmFtZT0iJXVwZGF0ZS5kaWFncmFtLm5hbWUiLz4KKyAgIDwvZXh0ZW5zaW9uPgorICAgCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyIgaWQ9InVwZGF0ZS1jbWQtYmluZGluZyI+CisgICAgICA8P2dtZmdlbiBnZW5lcmF0ZWQ9InRydWUiPz4KKyAgICAgIDxrZXkgCisgICAgICAgICBjb21tYW5kSWQ9ImNvbXJlbC5kaWFncmFtLnVwZGF0ZURpYWdyYW0iCisgICAgICAgICBjb250ZXh0SWQ9ImNvbXJlbC5kaWFncmFtLnVpLmRpYWdyYW1Db250ZXh0IgorICAgICAgICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCisgICAgICAgICBzZXF1ZW5jZT0iRjUiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyIgaWQ9ImNvbnRleHQtbWVudXMiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8IS0tIG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UudWkubWFpbi5tZW51P2FmdGVyPSI+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS51aS5tYWluLnRvb2xiYXI/YWZ0ZXI9Ij4KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbiAtLT4KKyAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLkRpYWdyYW1FZGl0b3JDb250ZXh0TWVudSI+CisgICAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9ImNvbXJlbC5kaWFncmFtLkxvYWRSZXNvdXJjZUFjdGlvbiI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4+CisgICAgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZVBhcnRJZCI+PGVxdWFscyB2YWx1ZT0iY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9ySUQiLz48L3dpdGg+CisgICAgICAgICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj48aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+IAorICAgICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9ImNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydCIvPgorICAgICAgICAgICAgICAgICAgPC9pdGVyYXRlPjwvd2l0aD4KKyAgICAgICAgICAgICAgIDwvYW5kPgorICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyIgaWQ9Im1lbnUtY29tbWFuZHMiPgorICAgICAgPD9nbWZnZW4gZ2VuZXJhdGVkPSJ0cnVlIj8+CisgICAgICA8Y2F0ZWdvcnkgaWQ9ImNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvcklEIiBuYW1lPSIlY21kY2F0ZWdvcnkubmFtZSIgZGVzY3JpcHRpb249IiVjbWRjYXRlZ29yeS5kZXNjIi8+CisgICAgICA8Y29tbWFuZCBpZD0iY29tcmVsLmRpYWdyYW0uTG9hZFJlc291cmNlQWN0aW9uIgorICAgICAgICAgbmFtZT0iTG9hZCBSZXNvdXJjZSIKKyAgICAgICAgIGNhdGVnb3J5SWQ9ImNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvcklEIgorICAgICAgICAgZGVmYXVsdEhhbmRsZXI9ImNvbXJlbC5kaWFncmFtLnBhcnQuTG9hZFJlc291cmNlQWN0aW9uIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiIGlkPSJtZW51LWhhbmRsZXJzIj4KKyAgICAgIDw/Z21mZ2VuIGdlbmVyYXRlZD0idHJ1ZSI/PgorICAgPC9leHRlbnNpb24+CisKKyAgIDwhLS0gb3B0aW9uYWxseSwgc3BlY2lmeSBrZXliaW5kaW5ncyAtLT4KKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMTE1NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQXRvbWljVW5pdDJDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDJDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0MkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBjb250YWluZXIgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRSZWZhY3RvcmluZ1VuaXQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJLyoNCisJCSAqIGNoYW5nZXM6IExpZXN0IGF1cyBlaW5lbSBSZXF1ZXN0IGRpZSBJRCBkZXMgTW9kZWxSZWZhY3RvcmluZ3MgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBBdG9taWNVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIHJlZklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCXdoaWxlIChjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsNCisJCQljb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY3IgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGNvbnRhaW5lcjsNCisJCWNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gY3INCisJCQkJLmdldEVtZlJlZmFjdG9yaW5nQXNNb2RlbFJlZmFjdG9yaW5nKHJlZklkKTsNCisJCWlmIChyZWZhY3RvcmluZyAhPSBudWxsDQorCQkJCSYmICFjci5nZXRNb2RlbFJlZmFjdG9yaW5ncygpLmNvbnRhaW5zKHJlZmFjdG9yaW5nKSkgew0KKwkJCWNyLmdldE1vZGVsUmVmYWN0b3JpbmdzKCkuYWRkKHJlZmFjdG9yaW5nKTsNCisJCX0NCisJCWNvbXJlbC5BdG9taWNVbml0IG5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZUF0b21pY1VuaXQocmVmYWN0b3JpbmcpOw0KKwkJLyogZW5kIG9mIGNoYW5nZSAqLw0KKw0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBvd25lciA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRSZWZhY3RvcmluZ1VuaXQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoQXRvbWljVW5pdCBuZXdFbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzNhY2MyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQzQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5BdG9taWNVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDNDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IGNvbnRhaW5lciA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0cygpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBNb2RlbFJlZmFjdG9yaW5ncyB1bmQNCisJCSAqIGVyc3RlbGx0IGFuaGFuZCBkZXNzZW4gZGllIEF0b21pY1VuaXQNCisJCSAqLw0KKwkJQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSk7DQorCQlTdHJpbmcgcmVmSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXQoDQorCQkJCWNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsUGFsZXR0ZUZhY3RvcnkuVU5JVF9JRCk7DQorCQljb21yZWwuQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBjcg0KKwkJCQkuZ2V0RW1mUmVmYWN0b3JpbmdBc01vZGVsUmVmYWN0b3JpbmcocmVmSWQpOw0KKwkJaWYgKHJlZmFjdG9yaW5nICE9IG51bGwNCisJCQkJJiYgIWNyLmdldE1vZGVsUmVmYWN0b3JpbmdzKCkuY29udGFpbnMocmVmYWN0b3JpbmcpKSB7DQorCQkJY3IuZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKS5hZGQocmVmYWN0b3JpbmcpOw0KKwkJfQ0KKwkJY29tcmVsLkF0b21pY1VuaXQgbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlQXRvbWljVW5pdChyZWZhY3RvcmluZyk7DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgb3duZXIgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRSZWZhY3RvcmluZ1VuaXRzKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKEF0b21pY1VuaXQgbmV3RWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQXRvbWljVW5pdDRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQXRvbWljVW5pdDRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5ZjVkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9BdG9taWNVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0NENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlTaW5nbGVRdWV1ZWRVbml0IGNvbnRhaW5lciA9IChTaW5nbGVRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldFJlZmFjdG9yaW5nVW5pdCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBNb2RlbFJlZmFjdG9yaW5ncyB1bmQNCisJCSAqIGVyc3RlbGx0IGFuaGFuZCBkZXNzZW4gZGllIEF0b21pY1VuaXQNCisJCSAqLw0KKwkJQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSk7DQorCQlTdHJpbmcgcmVmSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXQoDQorCQkJCWNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsUGFsZXR0ZUZhY3RvcnkuVU5JVF9JRCk7DQorCQljb21yZWwuQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBjcg0KKwkJCQkuZ2V0RW1mUmVmYWN0b3JpbmdBc01vZGVsUmVmYWN0b3JpbmcocmVmSWQpOw0KKwkJaWYgKHJlZmFjdG9yaW5nICE9IG51bGwNCisJCQkJJiYgIWNyLmdldE1vZGVsUmVmYWN0b3JpbmdzKCkuY29udGFpbnMocmVmYWN0b3JpbmcpKSB7DQorCQkJY3IuZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKS5hZGQocmVmYWN0b3JpbmcpOw0KKwkJfQ0KKwkJY29tcmVsLkF0b21pY1VuaXQgbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlQXRvbWljVW5pdChyZWZhY3RvcmluZyk7DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlTaW5nbGVRdWV1ZWRVbml0IG93bmVyID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShBdG9taWNVbml0IG5ld0VsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODc0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQXRvbWljVW5pdDVDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdDVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIE1vZGVsUmVmYWN0b3JpbmdzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgQXRvbWljVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyByZWZJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTW9kZWxSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IGNyDQorCQkJCS5nZXRFbWZSZWZhY3RvcmluZ0FzTW9kZWxSZWZhY3RvcmluZyhyZWZJZCk7DQorCQlpZiAocmVmYWN0b3JpbmcgIT0gbnVsbA0KKwkJCQkmJiAhY3IuZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKS5jb250YWlucyhyZWZhY3RvcmluZykpIHsNCisJCQljci5nZXRNb2RlbFJlZmFjdG9yaW5ncygpLmFkZChyZWZhY3RvcmluZyk7DQorCQl9DQorCQljb21yZWwuQXRvbWljVW5pdCBuZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVBdG9taWNVbml0KHJlZmFjdG9yaW5nKTsNCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCVNlcXVlbnRpYWxVbml0IG93bmVyID0gKFNlcXVlbnRpYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRSZWZhY3RvcmluZ1VuaXRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKwkJb3duZXIudXBkYXRlU2VxRXhlY3V0aW9uT3JkZXIoKTsNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShBdG9taWNVbml0IG5ld0VsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDViZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQXRvbWljVW5pdDZDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXQ2Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlDb25kaXRpb25hbFVuaXQgY29udGFpbmVyID0gKENvbmRpdGlvbmFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRUaGVuKCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIE1vZGVsUmVmYWN0b3JpbmdzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgQXRvbWljVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyByZWZJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTW9kZWxSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IGNyDQorCQkJCS5nZXRFbWZSZWZhY3RvcmluZ0FzTW9kZWxSZWZhY3RvcmluZyhyZWZJZCk7DQorCQlpZiAocmVmYWN0b3JpbmcgIT0gbnVsbA0KKwkJCQkmJiAhY3IuZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKS5jb250YWlucyhyZWZhY3RvcmluZykpIHsNCisJCQljci5nZXRNb2RlbFJlZmFjdG9yaW5ncygpLmFkZChyZWZhY3RvcmluZyk7DQorCQl9DQorCQljb21yZWwuQXRvbWljVW5pdCBuZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVBdG9taWNVbml0KHJlZmFjdG9yaW5nKTsNCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCUNvbmRpdGlvbmFsVW5pdCBvd25lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFRoZW4obmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoQXRvbWljVW5pdCBuZXdFbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9BdG9taWNVbml0N0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9BdG9taWNVbml0N0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJjMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0F0b21pY1VuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5BdG9taWNVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0N0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29uZGl0aW9uYWxVbml0IGNvbnRhaW5lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0RWxzZSgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBNb2RlbFJlZmFjdG9yaW5ncyB1bmQNCisJCSAqIGVyc3RlbGx0IGFuaGFuZCBkZXNzZW4gZGllIEF0b21pY1VuaXQNCisJCSAqLw0KKwkJQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSk7DQorCQlTdHJpbmcgcmVmSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXQoDQorCQkJCWNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsUGFsZXR0ZUZhY3RvcnkuVU5JVF9JRCk7DQorCQljb21yZWwuQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBjcg0KKwkJCQkuZ2V0RW1mUmVmYWN0b3JpbmdBc01vZGVsUmVmYWN0b3JpbmcocmVmSWQpOw0KKwkJaWYgKHJlZmFjdG9yaW5nICE9IG51bGwNCisJCQkJJiYgIWNyLmdldE1vZGVsUmVmYWN0b3JpbmdzKCkuY29udGFpbnMocmVmYWN0b3JpbmcpKSB7DQorCQkJY3IuZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKS5hZGQocmVmYWN0b3JpbmcpOw0KKwkJfQ0KKwkJY29tcmVsLkF0b21pY1VuaXQgbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlQXRvbWljVW5pdChyZWZhY3RvcmluZyk7DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRFbHNlKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKEF0b21pY1VuaXQgbmV3RWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQXRvbWljVW5pdENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9BdG9taWNVbml0Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTJiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQXRvbWljVW5pdENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBNb2RlbFJlZmFjdG9yaW5ncyB1bmQNCisJCSAqIGVyc3RlbGx0IGFuaGFuZCBkZXNzZW4gZGllIEF0b21pY1VuaXQNCisJCSAqLw0KKwkJQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSk7DQorCQlTdHJpbmcgcmVmSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXQoDQorCQkJCWNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsUGFsZXR0ZUZhY3RvcnkuVU5JVF9JRCk7DQorCQljb21yZWwuQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBjcg0KKwkJCQkuZ2V0RW1mUmVmYWN0b3JpbmdBc01vZGVsUmVmYWN0b3JpbmcocmVmSWQpOw0KKwkJaWYgKHJlZmFjdG9yaW5nICE9IG51bGwNCisJCQkJJiYgIWNyLmdldE1vZGVsUmVmYWN0b3JpbmdzKCkuY29udGFpbnMocmVmYWN0b3JpbmcpKSB7DQorCQkJY3IuZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKS5hZGQocmVmYWN0b3JpbmcpOw0KKwkJfQ0KKwkJY29tcmVsLkF0b21pY1VuaXQgbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlQXRvbWljVW5pdChyZWZhY3RvcmluZyk7DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBvd25lciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0TWFpblJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShBdG9taWNVbml0IG5ld0VsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NhcnRlc2lhblF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NhcnRlc2lhblF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmQ2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IGNvbnRhaW5lciA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldFJlZmFjdG9yaW5nVW5pdCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdCgpOw0KKwkJbmV3RWxlbWVudC5pbml0KCk7DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG93bmVyID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDYXJ0ZXNpYW5RdWV1ZWRVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNTgwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdCBjb250YWluZXIgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldFJlZmFjdG9yaW5nVW5pdHMoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXQoKTsNCisJCW5ld0VsZW1lbnQuaW5pdCgpOw0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG93bmVyID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0UmVmYWN0b3JpbmdVbml0cyhuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDYXJ0ZXNpYW5RdWV1ZWRVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5OTdkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXQ0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlTaW5nbGVRdWV1ZWRVbml0IGNvbnRhaW5lciA9IChTaW5nbGVRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldFJlZmFjdG9yaW5nVW5pdCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdCgpOw0KKwkJbmV3RWxlbWVudC5pbml0KCk7DQorCQlTaW5nbGVRdWV1ZWRVbml0IG93bmVyID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDYXJ0ZXNpYW5RdWV1ZWRVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ2FydGVzaWFuUXVldWVkVW5pdDVDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ2FydGVzaWFuUXVldWVkVW5pdDVDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0ZjZhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNlcXVlbnRpYWxVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDVDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXQoKTsNCisJCW5ld0VsZW1lbnQuaW5pdCgpOw0KKwkJU2VxdWVudGlhbFVuaXQgb3duZXIgPSAoU2VxdWVudGlhbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldFJlZmFjdG9yaW5nVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorCQlvd25lci51cGRhdGVTZXFFeGVjdXRpb25PcmRlcigpOw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKENhcnRlc2lhblF1ZXVlZFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmMzZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29uZGl0aW9uYWxVbml0IGNvbnRhaW5lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0VGhlbigpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdCgpOw0KKwkJbmV3RWxlbWVudC5pbml0KCk7DQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRUaGVuKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKENhcnRlc2lhblF1ZXVlZFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzNlMjJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29uZGl0aW9uYWxVbml0IGNvbnRhaW5lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0RWxzZSgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0KCk7DQorDQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRFbHNlKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKENhcnRlc2lhblF1ZXVlZFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwYmY1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldE1haW5SZWZhY3RvcmluZ1VuaXQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXQoKTsNCisJCW5ld0VsZW1lbnQuaW5pdCgpOw0KKw0KKwkJQ29tcG9zaXRlUmVmYWN0b3Jpbmcgb3duZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldE1haW5SZWZhY3RvcmluZ1VuaXQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoQ2FydGVzaWFuUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbXJlbENyZWF0ZVNob3J0Y3V0RGVjb3JhdGlvbnNDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ29tcmVsQ3JlYXRlU2hvcnRjdXREZWNvcmF0aW9uc0NvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE2MTYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbXJlbENyZWF0ZVNob3J0Y3V0RGVjb3JhdGlvbnNDb21tYW5kLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxDcmVhdGVTaG9ydGN1dERlY29yYXRpb25zQ29tbWFuZCBleHRlbmRzDQorCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdCBteURlc2NyaXB0b3JzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbENyZWF0ZVNob3J0Y3V0RGVjb3JhdGlvbnNDb21tYW5kKA0KKwkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIFZpZXcgcGFyZW50VmlldywNCisJCQlMaXN0IHZpZXdEZXNjcmlwdG9ycykgew0KKwkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgIkNyZWF0ZSBTaG9ydGN1dHMiLCBnZXRXb3Jrc3BhY2VGaWxlcyhwYXJlbnRWaWV3KSk7IC8vJE5PTi1OTFMtMSQNCisJCW15RGVzY3JpcHRvcnMgPSB2aWV3RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxDcmVhdGVTaG9ydGN1dERlY29yYXRpb25zQ29tbWFuZCgNCisJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBWaWV3IHBhcmVudFZpZXcsDQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3Igdmlld0Rlc2NyaXB0b3IpIHsNCisJCXRoaXMoZWRpdGluZ0RvbWFpbiwgcGFyZW50VmlldywgQ29sbGVjdGlvbnMNCisJCQkJLnNpbmdsZXRvbkxpc3Qodmlld0Rlc2NyaXB0b3IpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCWZvciAoSXRlcmF0b3IgaXQgPSBteURlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBuZXh0RGVzY3JpcHRvciA9IChDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcikgaXQNCisJCQkJCS5uZXh0KCk7DQorCQkJVmlldyB2aWV3ID0gKFZpZXcpIG5leHREZXNjcmlwdG9yLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7DQorCQkJaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7DQorCQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoDQorCQkJCQkJIm1vZGVsSUQiLCBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25DaGVja0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25DaGVja0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODUwNmJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbmRpdGlvbkNoZWNrQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25DaGVjazsNCitpbXBvcnQgY29tcmVsLkNvbmRpdGlvbmFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uQ2hlY2tDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNvbmRpdGlvbmFsVW5pdCBjb250YWluZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldElmKCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJQ29uZGl0aW9uQ2hlY2sgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVDb25kaXRpb25DaGVjaygpOw0KKw0KKwkJQ29uZGl0aW9uYWxVbml0IG93bmVyID0gKENvbmRpdGlvbmFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0SWYobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoQ29uZGl0aW9uQ2hlY2sgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbmRpdGlvbmFsVW5pdDJDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5OTM0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0MkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDJDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgY29udGFpbmVyID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJQ29uZGl0aW9uYWxVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlQ29uZGl0aW9uYWxVbml0KCk7DQorDQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG93bmVyID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQzQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbmRpdGlvbmFsVW5pdDNDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjMzQxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQzQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQzQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IGNvbnRhaW5lciA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0cygpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUNvbmRpdGlvbmFsVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUNvbmRpdGlvbmFsVW5pdCgpOw0KKw0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG93bmVyID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0UmVmYWN0b3JpbmdVbml0cyhuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbmRpdGlvbmFsVW5pdDRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyNWVlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCVNpbmdsZVF1ZXVlZFVuaXQgY29udGFpbmVyID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJQ29uZGl0aW9uYWxVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlQ29uZGl0aW9uYWxVbml0KCk7DQorDQorCQlTaW5nbGVRdWV1ZWRVbml0IG93bmVyID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbmRpdGlvbmFsVW5pdDVDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxOWE1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdDVDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXQ1Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVDb25kaXRpb25hbFVuaXQoKTsNCisNCisJCVNlcXVlbnRpYWxVbml0IG93bmVyID0gKFNlcXVlbnRpYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRSZWZhY3RvcmluZ1VuaXRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKwkJb3duZXIudXBkYXRlU2VxRXhlY3V0aW9uT3JkZXIoKTsNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyYTRjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQ2Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29uZGl0aW9uYWxVbml0IGNvbnRhaW5lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0VGhlbigpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUNvbmRpdGlvbmFsVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUNvbmRpdGlvbmFsVW5pdCgpOw0KKw0KKwkJQ29uZGl0aW9uYWxVbml0IG93bmVyID0gKENvbmRpdGlvbmFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0VGhlbihuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL0NvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiZTFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0N0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29uZGl0aW9uYWxVbml0IGNvbnRhaW5lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0RWxzZSgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUNvbmRpdGlvbmFsVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUNvbmRpdGlvbmFsVW5pdCgpOw0KKw0KKwkJQ29uZGl0aW9uYWxVbml0IG93bmVyID0gKENvbmRpdGlvbmFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0RWxzZShuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9Db25kaXRpb25hbFVuaXRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ29uZGl0aW9uYWxVbml0Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMWZmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvQ29uZGl0aW9uYWxVbml0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbmRpdGlvbmFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldE1haW5SZWZhY3RvcmluZ1VuaXQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlDb25kaXRpb25hbFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVDb25kaXRpb25hbFVuaXQoKTsNCisNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIG93bmVyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRNYWluUmVmYWN0b3JpbmdVbml0KG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKENvbmRpdGlvbmFsVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTc3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGZWF0dXJlVW5pdDJDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQ7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBIZWxwZXJzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgSGVscGVyVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyBoZWxwZXJJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBjb21yZWwuQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLk11bHRpRmVhdHVyZUhlbHBlciBoZWxwZXIgPSBjci5nZXRNdWx0aUZlYXR1cmVIZWxwZXIoaGVscGVySWQpOw0KKwkJaWYgKGhlbHBlciAhPSBudWxsICYmICFjci5nZXRIZWxwZXIoKS5jb250YWlucyhoZWxwZXIpKSB7DQorCQkJY3IuZ2V0SGVscGVyKCkuYWRkKGhlbHBlcik7DQorCQl9DQorCQljb21yZWwuTXVsdGlGZWF0dXJlVW5pdCBuZXdFbGVtZW50Ow0KKwkJaWYgKGhlbHBlciAhPSBudWxsKSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlGZWF0dXJlVW5pdChoZWxwZXIpOw0KKwkJfSBlbHNlIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZlYXR1cmVVbml0KCk7DQorCQl9DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgb3duZXIgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShNdWx0aUZlYXR1cmVVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMjk2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXQzQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyIGhlbHBlciA9IGNyLmdldE11bHRpRmVhdHVyZUhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5NdWx0aUZlYXR1cmVVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZlYXR1cmVVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU11bHRpRmVhdHVyZVVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCUNvbmRpdGlvbmFsVW5pdCBvd25lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldEhlbHBlclVuaXRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKE11bHRpRmVhdHVyZVVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmZjYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyIGhlbHBlciA9IGNyLmdldE11bHRpRmVhdHVyZUhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5NdWx0aUZlYXR1cmVVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZlYXR1cmVVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU11bHRpRmVhdHVyZVVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCVNpbmdsZVF1ZXVlZFVuaXQgb3duZXIgPSAoU2luZ2xlUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0SGVscGVyVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlGZWF0dXJlVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYzA0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyIGhlbHBlciA9IGNyLmdldE11bHRpRmVhdHVyZUhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5NdWx0aUZlYXR1cmVVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZlYXR1cmVVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU11bHRpRmVhdHVyZVVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCVNlcXVlbnRpYWxVbml0IG93bmVyID0gKFNlcXVlbnRpYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisJCW93bmVyLnVwZGF0ZVNlcUV4ZWN1dGlvbk9yZGVyKCk7DQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlGZWF0dXJlVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk0NGIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyIGhlbHBlciA9IGNyLmdldE11bHRpRmVhdHVyZUhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5NdWx0aUZlYXR1cmVVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZlYXR1cmVVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU11bHRpRmVhdHVyZVVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgb3duZXIgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0SGVscGVyVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlGZWF0dXJlVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmlsdGVyVW5pdDJDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNmZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmlsdGVyVW5pdDJDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpRmlsdGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdDJDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBIZWxwZXJzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgSGVscGVyVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyBoZWxwZXJJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBjb21yZWwuQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLk11bHRpRmlsdGVySGVscGVyIGhlbHBlciA9IGNyLmdldE11bHRpRmlsdGVySGVscGVyKGhlbHBlcklkKTsNCisJCWlmIChoZWxwZXIgIT0gbnVsbCAmJiAhY3IuZ2V0SGVscGVyKCkuY29udGFpbnMoaGVscGVyKSkgew0KKwkJCWNyLmdldEhlbHBlcigpLmFkZChoZWxwZXIpOw0KKwkJfQ0KKwkJY29tcmVsLk11bHRpRmlsdGVyVW5pdCBuZXdFbGVtZW50Ow0KKwkJaWYgKGhlbHBlciAhPSBudWxsKSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU11bHRpRmlsdGVyVW5pdCgpOw0KKwkJfQ0KKwkJLyogZW5kIG9mIGNoYW5nZSAqLw0KKw0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG93bmVyID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0SGVscGVyVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlGaWx0ZXJVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZpbHRlclVuaXQzQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NTVjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlGaWx0ZXJVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXIgaGVscGVyID0gY3IuZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoaGVscGVySWQpOw0KKwkJaWYgKGhlbHBlciAhPSBudWxsICYmICFjci5nZXRIZWxwZXIoKS5jb250YWlucyhoZWxwZXIpKSB7DQorCQkJY3IuZ2V0SGVscGVyKCkuYWRkKGhlbHBlcik7DQorCQl9DQorCQljb21yZWwuTXVsdGlGaWx0ZXJVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZpbHRlclVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCk7DQorCQl9DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShNdWx0aUZpbHRlclVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmZDM0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXIgaGVscGVyID0gY3IuZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoaGVscGVySWQpOw0KKwkJaWYgKGhlbHBlciAhPSBudWxsICYmICFjci5nZXRIZWxwZXIoKS5jb250YWlucyhoZWxwZXIpKSB7DQorCQkJY3IuZ2V0SGVscGVyKCkuYWRkKGhlbHBlcik7DQorCQl9DQorCQljb21yZWwuTXVsdGlGaWx0ZXJVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZpbHRlclVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCk7DQorCQl9DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlTaW5nbGVRdWV1ZWRVbml0IG93bmVyID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldEhlbHBlclVuaXRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKE11bHRpRmlsdGVyVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE0MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpRmlsdGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLlNlcXVlbnRpYWxVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXIgaGVscGVyID0gY3IuZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoaGVscGVySWQpOw0KKwkJaWYgKGhlbHBlciAhPSBudWxsICYmICFjci5nZXRIZWxwZXIoKS5jb250YWlucyhoZWxwZXIpKSB7DQorCQkJY3IuZ2V0SGVscGVyKCkuYWRkKGhlbHBlcik7DQorCQl9DQorCQljb21yZWwuTXVsdGlGaWx0ZXJVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZpbHRlclVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCk7DQorCQl9DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlTZXF1ZW50aWFsVW5pdCBvd25lciA9IChTZXF1ZW50aWFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0SGVscGVyVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorCQlvd25lci51cGRhdGVTZXFFeGVjdXRpb25PcmRlcigpOw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKE11bHRpRmlsdGVyVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4ZWE4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlclVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXIgaGVscGVyID0gY3IuZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoaGVscGVySWQpOw0KKwkJaWYgKGhlbHBlciAhPSBudWxsICYmICFjci5nZXRIZWxwZXIoKS5jb250YWlucyhoZWxwZXIpKSB7DQorCQkJY3IuZ2V0SGVscGVyKCkuYWRkKGhlbHBlcik7DQorCQl9DQorCQljb21yZWwuTXVsdGlGaWx0ZXJVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZpbHRlclVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCk7DQorCQl9DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG93bmVyID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldEhlbHBlclVuaXRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKE11bHRpRmlsdGVyVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDJDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4OGFhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDJDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgY29udGFpbmVyID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRNdWx0aUlucHV0UG9ydHMoKS5zaXplKCkgPj0gMikgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG93bmVyID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKE11bHRpSW5wdXRQb3J0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjUyYzdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlNdWx0aUlucHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorDQorCQlTaW5nbGVGZWF0dXJlVW5pdCBvd25lciA9IChTaW5nbGVGZWF0dXJlVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShNdWx0aUlucHV0UG9ydCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2NTMzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlNdWx0aUlucHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorDQorCQlNdWx0aUZlYXR1cmVVbml0IG93bmVyID0gKE11bHRpRmVhdHVyZVVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldFNlY29uZGFyeUlucHV0UG9ydHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjZmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCVNpbmdsZUZpbHRlclVuaXQgY29udGFpbmVyID0gKFNpbmdsZUZpbHRlclVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0SW5wdXRQb3J0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkJU2luZ2xlRmlsdGVyVW5pdCBvd25lciA9IChTaW5nbGVGaWx0ZXJVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRJbnB1dFBvcnQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDZDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQ2Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDRkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQ2Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJTXVsdGlGaWx0ZXJVbml0IGNvbnRhaW5lciA9IChNdWx0aUZpbHRlclVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0SW5wdXRQb3J0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkJTXVsdGlGaWx0ZXJVbml0IG93bmVyID0gKE11bHRpRmlsdGVyVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0SW5wdXRQb3J0KG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKE11bHRpSW5wdXRQb3J0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM2ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlTaW5nbGVRdWV1ZWRVbml0IGNvbnRhaW5lciA9IChTaW5nbGVRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldE11bHRpSW5wdXRQb3J0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkJU2luZ2xlUXVldWVkVW5pdCBvd25lciA9IChTaW5nbGVRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRNdWx0aUlucHV0UG9ydChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShNdWx0aUlucHV0UG9ydCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzYTg0NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2VxdWVudGlhbFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkJU2VxdWVudGlhbFVuaXQgb3duZXIgPSAoU2VxdWVudGlhbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldElucHV0UG9ydHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydDlDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTI0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlNdWx0aUlucHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorDQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRJbnB1dFBvcnRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKE11bHRpSW5wdXRQb3J0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxM2U1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aUlucHV0UG9ydENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBjb250YWluZXIgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRNdWx0aUlucHV0UG9ydHMoKS5zaXplKCkgPj0gMikgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBvd25lciA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRNdWx0aUlucHV0UG9ydHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlJbnB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlOTQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aU91dHB1dFBvcnQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJTXVsdGlGaWx0ZXJVbml0IGNvbnRhaW5lciA9IChNdWx0aUZpbHRlclVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0T3V0cHV0UG9ydCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCU11bHRpT3V0cHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZU11bHRpT3V0cHV0UG9ydCgpOw0KKw0KKwkJTXVsdGlGaWx0ZXJVbml0IG93bmVyID0gKE11bHRpRmlsdGVyVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0T3V0cHV0UG9ydChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShNdWx0aU91dHB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aU91dHB1dFBvcnRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmRkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlPdXRwdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlNdWx0aUZlYXR1cmVVbml0IGNvbnRhaW5lciA9IChNdWx0aUZlYXR1cmVVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldE91dHB1dFBvcnQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlNdWx0aU91dHB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aU91dHB1dFBvcnQoKTsNCisNCisJCU11bHRpRmVhdHVyZVVuaXQgb3duZXIgPSAoTXVsdGlGZWF0dXJlVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0T3V0cHV0UG9ydChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShNdWx0aU91dHB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4NTU0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgRU9iamVjdCBzb3VyY2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIEVPYmplY3QgdGFyZ2V0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBmaW5hbCBDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LA0KKwkJCUVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCkgew0KKwkJc3VwZXIocmVxdWVzdC5nZXRMYWJlbCgpLCBudWxsLCByZXF1ZXN0KTsNCisJCXRoaXMuc291cmNlID0gc291cmNlOw0KKwkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7DQorCQljb250YWluZXIgPSBkZWR1Y2VDb250YWluZXIoc291cmNlLCB0YXJnZXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJaWYgKHNvdXJjZSA9PSBudWxsICYmIHRhcmdldCA9PSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZSAhPSBudWxsICYmIGZhbHNlID09IHNvdXJjZSBpbnN0YW5jZW9mIE11bHRpUG9ydCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiBmYWxzZSA9PSB0YXJnZXQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCWlmIChnZXRTb3VyY2UoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIHRydWU7IC8vIGxpbmsgY3JlYXRpb24gaXMgaW4gcHJvZ3Jlc3M7IHNvdXJjZSBpcyBub3QgZGVmaW5lZCB5ZXQNCisJCX0NCisJCS8vIHRhcmdldCBtYXkgYmUgbnVsbCBoZXJlIGJ1dCBpdCdzIHBvc3NpYmxlIHRvIGNoZWNrIGNvbnN0cmFpbnQNCisJCWlmIChnZXRDb250YWluZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmdldExpbmtDb25zdHJhaW50cygpDQorCQkJCS5jYW5DcmVhdGVNdWx0aVBvcnRNYXBwaW5nXzQwMDIoZ2V0Q29udGFpbmVyKCksIGdldFNvdXJjZSgpLA0KKwkJCQkJCWdldFRhcmdldCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCWlmICghY2FuRXhlY3V0ZSgpKSB7DQorCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigNCisJCQkJCSJJbnZhbGlkIGFyZ3VtZW50cyBpbiBjcmVhdGUgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisNCisJCU11bHRpUG9ydE1hcHBpbmcgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVNdWx0aVBvcnRNYXBwaW5nKCk7DQorCQlnZXRDb250YWluZXIoKS5nZXRQb3J0TWFwcGluZ3MoKS5hZGQobmV3RWxlbWVudCk7DQorCQluZXdFbGVtZW50LnNldFNvdXJjZShnZXRTb3VyY2UoKSk7DQorCQluZXdFbGVtZW50LnNldFRhcmdldChnZXRUYXJnZXQoKSk7DQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoTXVsdGlQb3J0TWFwcGluZyBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRQYXJhbWV0ZXIoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdC5TT1VSQ0UsDQorCQkJCWdldFNvdXJjZSgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0UGFyYW1ldGVyKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QuVEFSR0VULA0KKwkJCQlnZXRUYXJnZXQoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlQb3J0IGdldFNvdXJjZSgpIHsNCisJCXJldHVybiAoTXVsdGlQb3J0KSBzb3VyY2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUlucHV0UG9ydCBnZXRUYXJnZXQoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0KSB0YXJnZXQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21wb3NpdGVSZWZhY3RvcmluZyBnZXRDb250YWluZXIoKSB7DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGFwcHJvYWNoIGlzIHRvIHRyYXZlcnNlIGFuY2VzdG9ycyBvZiB0aGUgc291cmNlIHRvIGZpbmQgaW5zdGFuY2Ugb2YgY29udGFpbmVyLg0KKwkgKiBNb2RpZnkgd2l0aCBhcHByb3ByaWF0ZSBsb2dpYy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgQ29tcG9zaXRlUmVmYWN0b3JpbmcgZGVkdWNlQ29udGFpbmVyKEVPYmplY3Qgc291cmNlLA0KKwkJCUVPYmplY3QgdGFyZ2V0KSB7DQorCQkvLyBGaW5kIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgbmV3IGxpbmsuDQorCQkvLyBDbGltYiB1cCBieSBjb250YWlubWVudCBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbSB0aGUgc291cmNlDQorCQkvLyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgaW5zdGFuY2Ugb2YgdGhlIGNvbnRhaW5lciBjbGFzcy4NCisJCWZvciAoRU9iamVjdCBlbGVtZW50ID0gc291cmNlOyBlbGVtZW50ICE9IG51bGw7IGVsZW1lbnQgPSBlbGVtZW50DQorCQkJCS5lQ29udGFpbmVyKCkpIHsNCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlZmFjdG9yaW5nKSB7DQorCQkJCXJldHVybiAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGVsZW1lbnQ7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MWNiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBmaW5hbCBpbnQgcmVvcmllbnREaXJlY3Rpb247DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIEVPYmplY3Qgb2xkRW5kOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG5ld0VuZDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlzdXBlcihyZXF1ZXN0LmdldExhYmVsKCksIHJlcXVlc3QuZ2V0UmVsYXRpb25zaGlwKCksIHJlcXVlc3QpOw0KKwkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOw0KKwkJb2xkRW5kID0gcmVxdWVzdC5nZXRPbGRSZWxhdGlvbnNoaXBFbmQoKTsNCisJCW5ld0VuZCA9IHJlcXVlc3QuZ2V0TmV3UmVsYXRpb25zaGlwRW5kKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlpZiAoZmFsc2UgPT0gZ2V0RWxlbWVudFRvRWRpdCgpIGluc3RhbmNlb2YgTXVsdGlQb3J0TWFwcGluZykgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7DQorCQkJcmV0dXJuIGNhblJlb3JpZW50U291cmNlKCk7DQorCQl9DQorCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgew0KKwkJCXJldHVybiBjYW5SZW9yaWVudFRhcmdldCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFNvdXJjZSgpIHsNCisJCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE11bHRpUG9ydCAmJiBuZXdFbmQgaW5zdGFuY2VvZiBNdWx0aVBvcnQpKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJTXVsdGlJbnB1dFBvcnQgdGFyZ2V0ID0gZ2V0TGluaygpLmdldFRhcmdldCgpOw0KKwkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlZmFjdG9yaW5nKSkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgZ2V0TGluaygpDQorCQkJCS5lQ29udGFpbmVyKCk7DQorCQlyZXR1cm4gQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuZ2V0TGlua0NvbnN0cmFpbnRzKCkNCisJCQkJLmNhbkV4aXN0TXVsdGlQb3J0TWFwcGluZ180MDAyKGNvbnRhaW5lciwgZ2V0TGluaygpLA0KKwkJCQkJCWdldE5ld1NvdXJjZSgpLCB0YXJnZXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFRhcmdldCgpIHsNCisJCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0ICYmIG5ld0VuZCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0KSkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCU11bHRpUG9ydCBzb3VyY2UgPSBnZXRMaW5rKCkuZ2V0U291cmNlKCk7DQorCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ29tcG9zaXRlUmVmYWN0b3JpbmcpKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBnZXRMaW5rKCkNCisJCQkJLmVDb250YWluZXIoKTsNCisJCXJldHVybiBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5nZXRMaW5rQ29uc3RyYWludHMoKQ0KKwkJCQkuY2FuRXhpc3RNdWx0aVBvcnRNYXBwaW5nXzQwMDIoY29udGFpbmVyLCBnZXRMaW5rKCksIHNvdXJjZSwNCisJCQkJCQlnZXROZXdUYXJnZXQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlpZiAoIWNhbkV4ZWN1dGUoKSkgew0KKwkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oDQorCQkJCQkiSW52YWxpZCBhcmd1bWVudHMgaW4gcmVvcmllbnQgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7DQorCQkJcmV0dXJuIHJlb3JpZW50U291cmNlKCk7DQorCQl9DQorCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgew0KKwkJCXJldHVybiByZW9yaWVudFRhcmdldCgpOw0KKwkJfQ0KKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJZ2V0TGluaygpLnNldFNvdXJjZShnZXROZXdTb3VyY2UoKSk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCWdldExpbmsoKS5zZXRUYXJnZXQoZ2V0TmV3VGFyZ2V0KCkpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aVBvcnRNYXBwaW5nIGdldExpbmsoKSB7DQorCQlyZXR1cm4gKE11bHRpUG9ydE1hcHBpbmcpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE11bHRpUG9ydCBnZXRPbGRTb3VyY2UoKSB7DQorCQlyZXR1cm4gKE11bHRpUG9ydCkgb2xkRW5kOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlQb3J0IGdldE5ld1NvdXJjZSgpIHsNCisJCXJldHVybiAoTXVsdGlQb3J0KSBuZXdFbmQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUlucHV0UG9ydCBnZXRPbGRUYXJnZXQoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0KSBvbGRFbmQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUlucHV0UG9ydCBnZXROZXdUYXJnZXQoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0KSBuZXdFbmQ7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjhkYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL011bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgRU9iamVjdCBzb3VyY2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIEVPYmplY3QgdGFyZ2V0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBmaW5hbCBDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LCBFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCB0YXJnZXQpIHsNCisJCXN1cGVyKHJlcXVlc3QuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxdWVzdCk7DQorCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsNCisJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KKwkJY29udGFpbmVyID0gZGVkdWNlQ29udGFpbmVyKHNvdXJjZSwgdGFyZ2V0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCWlmIChzb3VyY2UgPT0gbnVsbCAmJiB0YXJnZXQgPT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBmYWxzZSA9PSBzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aVBvcnQpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgZmFsc2UgPT0gdGFyZ2V0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0KSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJaWYgKGdldFNvdXJjZSgpID09IG51bGwpIHsNCisJCQlyZXR1cm4gdHJ1ZTsgLy8gbGluayBjcmVhdGlvbiBpcyBpbiBwcm9ncmVzczsgc291cmNlIGlzIG5vdCBkZWZpbmVkIHlldA0KKwkJfQ0KKwkJLy8gdGFyZ2V0IG1heSBiZSBudWxsIGhlcmUgYnV0IGl0J3MgcG9zc2libGUgdG8gY2hlY2sgY29uc3RyYWludA0KKwkJaWYgKGdldENvbnRhaW5lcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuZ2V0TGlua0NvbnN0cmFpbnRzKCkNCisJCQkJLmNhbkNyZWF0ZU11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyhnZXRDb250YWluZXIoKSwNCisJCQkJCQlnZXRTb3VyY2UoKSwgZ2V0VGFyZ2V0KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJaWYgKCFjYW5FeGVjdXRlKCkpIHsNCisJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKA0KKwkJCQkJIkludmFsaWQgYXJndW1lbnRzIGluIGNyZWF0ZSBsaW5rIGNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKw0KKwkJTXVsdGlTaW5nbGVQb3J0TWFwcGluZyBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZU11bHRpU2luZ2xlUG9ydE1hcHBpbmcoKTsNCisJCWdldENvbnRhaW5lcigpLmdldFBvcnRNYXBwaW5ncygpLmFkZChuZXdFbGVtZW50KTsNCisJCW5ld0VsZW1lbnQuc2V0U291cmNlKGdldFNvdXJjZSgpKTsNCisJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KGdldFRhcmdldCgpKTsNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldFBhcmFtZXRlcihDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0LlNPVVJDRSwNCisJCQkJZ2V0U291cmNlKCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRQYXJhbWV0ZXIoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdC5UQVJHRVQsDQorCQkJCWdldFRhcmdldCgpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgew0KKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aVBvcnQgZ2V0U291cmNlKCkgew0KKwkJcmV0dXJuIChNdWx0aVBvcnQpIHNvdXJjZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUlucHV0UG9ydCBnZXRUYXJnZXQoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydCkgdGFyZ2V0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcG9zaXRlUmVmYWN0b3JpbmcgZ2V0Q29udGFpbmVyKCkgew0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBhcHByb2FjaCBpcyB0byB0cmF2ZXJzZSBhbmNlc3RvcnMgb2YgdGhlIHNvdXJjZSB0byBmaW5kIGluc3RhbmNlIG9mIGNvbnRhaW5lci4NCisJICogTW9kaWZ5IHdpdGggYXBwcm9wcmlhdGUgbG9naWMuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIENvbXBvc2l0ZVJlZmFjdG9yaW5nIGRlZHVjZUNvbnRhaW5lcihFT2JqZWN0IHNvdXJjZSwNCisJCQlFT2JqZWN0IHRhcmdldCkgew0KKwkJLy8gRmluZCBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG5ldyBsaW5rLg0KKwkJLy8gQ2xpbWIgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlIHNvdXJjZQ0KKwkJLy8gYW5kIHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mIHRoZSBjb250YWluZXIgY2xhc3MuDQorCQlmb3IgKEVPYmplY3QgZWxlbWVudCA9IHNvdXJjZTsgZWxlbWVudCAhPSBudWxsOyBlbGVtZW50ID0gZWxlbWVudA0KKwkJCQkuZUNvbnRhaW5lcigpKSB7DQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCQlyZXR1cm4gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBlbGVtZW50Ow0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODY2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5NdWx0aVBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIGludCByZW9yaWVudERpcmVjdGlvbjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgRU9iamVjdCBvbGRFbmQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIEVPYmplY3QgbmV3RW5kOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQoDQorCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCXN1cGVyKHJlcXVlc3QuZ2V0TGFiZWwoKSwgcmVxdWVzdC5nZXRSZWxhdGlvbnNoaXAoKSwgcmVxdWVzdCk7DQorCQlyZW9yaWVudERpcmVjdGlvbiA9IHJlcXVlc3QuZ2V0RGlyZWN0aW9uKCk7DQorCQlvbGRFbmQgPSByZXF1ZXN0LmdldE9sZFJlbGF0aW9uc2hpcEVuZCgpOw0KKwkJbmV3RW5kID0gcmVxdWVzdC5nZXROZXdSZWxhdGlvbnNoaXBFbmQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCWlmIChmYWxzZSA9PSBnZXRFbGVtZW50VG9FZGl0KCkgaW5zdGFuY2VvZiBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsNCisJCQlyZXR1cm4gY2FuUmVvcmllbnRTb3VyY2UoKTsNCisJCX0NCisJCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7DQorCQkJcmV0dXJuIGNhblJlb3JpZW50VGFyZ2V0KCk7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50U291cmNlKCkgew0KKwkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgTXVsdGlQb3J0ICYmIG5ld0VuZCBpbnN0YW5jZW9mIE11bHRpUG9ydCkpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlTaW5nbGVJbnB1dFBvcnQgdGFyZ2V0ID0gZ2V0TGluaygpLmdldFRhcmdldCgpOw0KKwkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlZmFjdG9yaW5nKSkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgZ2V0TGluaygpDQorCQkJCS5lQ29udGFpbmVyKCk7DQorCQlyZXR1cm4gQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuZ2V0TGlua0NvbnN0cmFpbnRzKCkNCisJCQkJLmNhbkV4aXN0TXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKGNvbnRhaW5lciwgZ2V0TGluaygpLA0KKwkJCQkJCWdldE5ld1NvdXJjZSgpLCB0YXJnZXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFRhcmdldCgpIHsNCisJCWlmICghKG9sZEVuZCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydCAmJiBuZXdFbmQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQpKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJTXVsdGlQb3J0IHNvdXJjZSA9IGdldExpbmsoKS5nZXRTb3VyY2UoKTsNCisJCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGdldExpbmsoKQ0KKwkJCQkuZUNvbnRhaW5lcigpOw0KKwkJcmV0dXJuIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmdldExpbmtDb25zdHJhaW50cygpDQorCQkJCS5jYW5FeGlzdE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyhjb250YWluZXIsIGdldExpbmsoKSwNCisJCQkJCQlzb3VyY2UsIGdldE5ld1RhcmdldCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCWlmICghY2FuRXhlY3V0ZSgpKSB7DQorCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigNCisJCQkJCSJJbnZhbGlkIGFyZ3VtZW50cyBpbiByZW9yaWVudCBsaW5rIGNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsNCisJCQlyZXR1cm4gcmVvcmllbnRTb3VyY2UoKTsNCisJCX0NCisJCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7DQorCQkJcmV0dXJuIHJlb3JpZW50VGFyZ2V0KCk7DQorCQl9DQorCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50U291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlnZXRMaW5rKCkuc2V0U291cmNlKGdldE5ld1NvdXJjZSgpKTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFRhcmdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJZ2V0TGluaygpLnNldFRhcmdldChnZXROZXdUYXJnZXQoKSk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE11bHRpU2luZ2xlUG9ydE1hcHBpbmcgZ2V0TGluaygpIHsNCisJCXJldHVybiAoTXVsdGlTaW5nbGVQb3J0TWFwcGluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlQb3J0IGdldE9sZFNvdXJjZSgpIHsNCisJCXJldHVybiAoTXVsdGlQb3J0KSBvbGRFbmQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aVBvcnQgZ2V0TmV3U291cmNlKCkgew0KKwkJcmV0dXJuIChNdWx0aVBvcnQpIG5ld0VuZDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUlucHV0UG9ydCBnZXRPbGRUYXJnZXQoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydCkgb2xkRW5kOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlSW5wdXRQb3J0IGdldE5ld1RhcmdldCgpIHsNCisJCXJldHVybiAoU2luZ2xlSW5wdXRQb3J0KSBuZXdFbmQ7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM3MjU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBjb250YWluZXIgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRSZWZhY3RvcmluZ1VuaXQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0KCk7DQorCQluZXdFbGVtZW50LmluaXQoKTsNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgb3duZXIgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0UmVmYWN0b3JpbmdVbml0KG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGI5YzFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbmRpdGlvbmFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlDb25kaXRpb25hbFVuaXQgY29udGFpbmVyID0gKENvbmRpdGlvbmFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRUaGVuKCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpOw0KKwkJbmV3RWxlbWVudC5pbml0KCk7DQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRUaGVuKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWFhYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXQ0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgY29udGFpbmVyID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRSZWZhY3RvcmluZ1VuaXRzKCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpOw0KKwkJbmV3RWxlbWVudC5pbml0KCk7DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgb3duZXIgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRSZWZhY3RvcmluZ1VuaXRzKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDVDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWU4MjYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDVDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJU2luZ2xlUXVldWVkVW5pdCBjb250YWluZXIgPSAoU2luZ2xlUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRSZWZhY3RvcmluZ1VuaXQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0KCk7DQorCQluZXdFbGVtZW50LmluaXQoKTsNCisJCVNpbmdsZVF1ZXVlZFVuaXQgb3duZXIgPSAoU2luZ2xlUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0UmVmYWN0b3JpbmdVbml0KG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGFiMmZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLlNlcXVlbnRpYWxVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpOw0KKwkJbmV3RWxlbWVudC5pbml0KCk7DQorCQlTZXF1ZW50aWFsVW5pdCBvd25lciA9IChTZXF1ZW50aWFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0UmVmYWN0b3JpbmdVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisJCW93bmVyLnVwZGF0ZVNlcUV4ZWN1dGlvbk9yZGVyKCk7DQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoUGFyYWxsZWxRdWV1ZWRVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9QYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDRiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNvbmRpdGlvbmFsVW5pdCBjb250YWluZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldEVsc2UoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0KCk7DQorCQluZXdFbGVtZW50LmluaXQoKTsNCisJCUNvbmRpdGlvbmFsVW5pdCBvd25lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldEVsc2UobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoUGFyYWxsZWxRdWV1ZWRVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvUGFyYWxsZWxRdWV1ZWRVbml0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDA5YTJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1BhcmFsbGVsUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRNYWluUmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpOw0KKwkJbmV3RWxlbWVudC5pbml0KCk7DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBvd25lciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0TWFpblJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShQYXJhbGxlbFF1ZXVlZFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZWExZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuU2VxdWVudGlhbFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgY29udGFpbmVyID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpOw0KKw0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBvd25lciA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRSZWZhY3RvcmluZ1VuaXQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TZXF1ZW50aWFsVW5pdDNDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTg4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IGNvbnRhaW5lciA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0cygpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNlcXVlbnRpYWxVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlU2VxdWVudGlhbFVuaXQoKTsNCisNCisJCVBhcmFsbGVsUXVldWVkVW5pdCBvd25lciA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFJlZmFjdG9yaW5nVW5pdHMobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYWEyODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCVNpbmdsZVF1ZXVlZFVuaXQgY29udGFpbmVyID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpOw0KKw0KKwkJU2luZ2xlUXVldWVkVW5pdCBvd25lciA9IChTaW5nbGVRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRSZWZhY3RvcmluZ1VuaXQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TZXF1ZW50aWFsVW5pdDVDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDNkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29uZGl0aW9uYWxVbml0IGNvbnRhaW5lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0VGhlbigpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNlcXVlbnRpYWxVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlU2VxdWVudGlhbFVuaXQoKTsNCisNCisJCUNvbmRpdGlvbmFsVW5pdCBvd25lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldFRoZW4obmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TZXF1ZW50aWFsVW5pdDZDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWYzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0NkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0NkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpOw0KKw0KKwkJU2VxdWVudGlhbFVuaXQgb3duZXIgPSAoU2VxdWVudGlhbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldFJlZmFjdG9yaW5nVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorCQlvd25lci51cGRhdGVTZXFFeGVjdXRpb25PcmRlcigpOw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNlcXVlbnRpYWxVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNkNzhiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2VxdWVudGlhbFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNvbmRpdGlvbmFsVW5pdCBjb250YWluZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlpZiAoY29udGFpbmVyLmdldEVsc2UoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlTZXF1ZW50aWFsVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVNlcXVlbnRpYWxVbml0KCk7DQorDQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRFbHNlKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNlcXVlbnRpYWxVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2VxdWVudGlhbFVuaXRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0YjMzZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TZXF1ZW50aWFsVW5pdENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRNYWluUmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpOw0KKw0KKwkJQ29tcG9zaXRlUmVmYWN0b3Jpbmcgb3duZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldE1haW5SZWZhY3RvcmluZ1VuaXQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2VxdWVudGlhbFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGZWF0dXJlVW5pdDJDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDMwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJLyoNCisJCSAqIGNoYW5nZXM6IExpZXN0IGF1cyBlaW5lbSBSZXF1ZXN0IGRpZSBJRCBkZXMgSGVscGVycyB1bmQNCisJCSAqIGVyc3RlbGx0IGFuaGFuZCBkZXNzZW4gZGllIEhlbHBlclVuaXQNCisJCSAqLw0KKwkJQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSk7DQorCQlTdHJpbmcgaGVscGVySWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXQoDQorCQkJCWNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsUGFsZXR0ZUZhY3RvcnkuVU5JVF9JRCk7DQorCQljb21yZWwuQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gY29tcmVsLkNvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCXdoaWxlIChjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsNCisJCQljb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY3IgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGNvbnRhaW5lcjsNCisJCWNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyIGhlbHBlciA9IGNyLmdldFNpbmdsZUZlYXR1cmVIZWxwZXIoaGVscGVySWQpOw0KKwkJaWYgKGhlbHBlciAhPSBudWxsICYmICFjci5nZXRIZWxwZXIoKS5jb250YWlucyhoZWxwZXIpKSB7DQorCQkJY3IuZ2V0SGVscGVyKCkuYWRkKGhlbHBlcik7DQorCQl9DQorCQljb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQgbmV3RWxlbWVudDsNCisJCWlmIChoZWxwZXIgIT0gbnVsbCkgew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0KCk7DQorCQl9DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgb3duZXIgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVGZWF0dXJlVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4YWM0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbmRpdGlvbmFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXQzQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQzQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBIZWxwZXJzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgSGVscGVyVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyBoZWxwZXJJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBjb21yZWwuQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXIgaGVscGVyID0gY3IuZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCBuZXdFbGVtZW50Ow0KKwkJaWYgKGhlbHBlciAhPSBudWxsKSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCUNvbmRpdGlvbmFsVW5pdCBvd25lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldEhlbHBlclVuaXRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZUZlYXR1cmVVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTY3YTMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBIZWxwZXJzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgSGVscGVyVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyBoZWxwZXJJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBjb21yZWwuQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXIgaGVscGVyID0gY3IuZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCBuZXdFbGVtZW50Ow0KKwkJaWYgKGhlbHBlciAhPSBudWxsKSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCVNpbmdsZVF1ZXVlZFVuaXQgb3duZXIgPSAoU2luZ2xlUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0SGVscGVyVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlRmVhdHVyZVVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGZjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBIZWxwZXJzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgSGVscGVyVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyBoZWxwZXJJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBjb21yZWwuQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXIgaGVscGVyID0gY3IuZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCBuZXdFbGVtZW50Ow0KKwkJaWYgKGhlbHBlciAhPSBudWxsKSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCVNlcXVlbnRpYWxVbml0IG93bmVyID0gKFNlcXVlbnRpYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVGZWF0dXJlVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2E4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuU2luZ2xlRmVhdHVyZUhlbHBlciBoZWxwZXIgPSBjci5nZXRTaW5nbGVGZWF0dXJlSGVscGVyKGhlbHBlcklkKTsNCisJCWlmIChoZWxwZXIgIT0gbnVsbCAmJiAhY3IuZ2V0SGVscGVyKCkuY29udGFpbnMoaGVscGVyKSkgew0KKwkJCWNyLmdldEhlbHBlcigpLmFkZChoZWxwZXIpOw0KKwkJfQ0KKwkJY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVGZWF0dXJlVW5pdChoZWxwZXIpOw0KKwkJfSBlbHNlIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVGZWF0dXJlVW5pdCgpOw0KKwkJfQ0KKwkJLyogZW5kIG9mIGNoYW5nZSAqLw0KKw0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBvd25lciA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVGZWF0dXJlVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDE4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmlsdGVyVW5pdDJDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkvKg0KKwkJICogY2hhbmdlczogTGllc3QgYXVzIGVpbmVtIFJlcXVlc3QgZGllIElEIGRlcyBIZWxwZXJzIHVuZA0KKwkJICogZXJzdGVsbHQgYW5oYW5kIGRlc3NlbiBkaWUgSGVscGVyVW5pdA0KKwkJICovDQorCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKTsNCisJCVN0cmluZyBoZWxwZXJJZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldCgNCisJCQkJY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lEKTsNCisJCWNvbXJlbC5Db21yZWxGYWN0b3J5IGZhY3RvcnkgPSBjb21yZWwuQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJd2hpbGUgKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJY29tcmVsLlNpbmdsZUZpbHRlckhlbHBlciBoZWxwZXIgPSBjci5nZXRTaW5nbGVGaWx0ZXJIZWxwZXIoaGVscGVySWQpOw0KKwkJaWYgKGhlbHBlciAhPSBudWxsICYmICFjci5nZXRIZWxwZXIoKS5jb250YWlucyhoZWxwZXIpKSB7DQorCQkJY3IuZ2V0SGVscGVyKCkuYWRkKGhlbHBlcik7DQorCQl9DQorCQljb21yZWwuU2luZ2xlRmlsdGVyVW5pdCBuZXdFbGVtZW50Ow0KKwkJaWYgKGhlbHBlciAhPSBudWxsKSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmlsdGVyVW5pdChoZWxwZXIpOw0KKwkJfSBlbHNlIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVGaWx0ZXJVbml0KCk7DQorCQl9DQorCQkvKiBlbmQgb2YgY2hhbmdlICovDQorDQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgb3duZXIgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVGaWx0ZXJVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2OTkxZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXQzQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuU2luZ2xlRmlsdGVySGVscGVyIGhlbHBlciA9IGNyLmdldFNpbmdsZUZpbHRlckhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVGaWx0ZXJVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUZpbHRlclVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCUNvbmRpdGlvbmFsVW5pdCBvd25lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldEhlbHBlclVuaXRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZUZpbHRlclVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTc1MTAzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuU2luZ2xlRmlsdGVySGVscGVyIGhlbHBlciA9IGNyLmdldFNpbmdsZUZpbHRlckhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVGaWx0ZXJVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUZpbHRlclVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCVNpbmdsZVF1ZXVlZFVuaXQgb3duZXIgPSAoU2luZ2xlUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0SGVscGVyVW5pdHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlRmlsdGVyVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDlhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNlcXVlbnRpYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCS8qDQorCQkgKiBjaGFuZ2VzOiBMaWVzdCBhdXMgZWluZW0gUmVxdWVzdCBkaWUgSUQgZGVzIEhlbHBlcnMgdW5kDQorCQkgKiBlcnN0ZWxsdCBhbmhhbmQgZGVzc2VuIGRpZSBIZWxwZXJVbml0DQorCQkgKi8NCisJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpOw0KKwkJU3RyaW5nIGhlbHBlcklkID0gKFN0cmluZykgcmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KA0KKwkJCQljb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFBhbGV0dGVGYWN0b3J5LlVOSVRfSUQpOw0KKwkJY29tcmVsLkNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IGNvbXJlbC5Db21yZWxGYWN0b3J5LmVJTlNUQU5DRTsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQl3aGlsZSAoY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBjb250YWluZXI7DQorCQljb21yZWwuU2luZ2xlRmlsdGVySGVscGVyIGhlbHBlciA9IGNyLmdldFNpbmdsZUZpbHRlckhlbHBlcihoZWxwZXJJZCk7DQorCQlpZiAoaGVscGVyICE9IG51bGwgJiYgIWNyLmdldEhlbHBlcigpLmNvbnRhaW5zKGhlbHBlcikpIHsNCisJCQljci5nZXRIZWxwZXIoKS5hZGQoaGVscGVyKTsNCisJCX0NCisJCWNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0IG5ld0VsZW1lbnQ7DQorCQlpZiAoaGVscGVyICE9IG51bGwpIHsNCisJCQluZXdFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVGaWx0ZXJVbml0KGhlbHBlcik7DQorCQl9IGVsc2Ugew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUZpbHRlclVuaXQoKTsNCisJCX0NCisJCS8qIGVuZCBvZiBjaGFuZ2UgKi8NCisNCisJCVNlcXVlbnRpYWxVbml0IG93bmVyID0gKFNlcXVlbnRpYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVGaWx0ZXJVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjU0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJLyoNCisJCSAqIGNoYW5nZXM6IExpZXN0IGF1cyBlaW5lbSBSZXF1ZXN0IGRpZSBJRCBkZXMgSGVscGVycyB1bmQNCisJCSAqIGVyc3RlbGx0IGFuaGFuZCBkZXNzZW4gZGllIEhlbHBlclVuaXQNCisJCSAqLw0KKwkJQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSk7DQorCQlTdHJpbmcgaGVscGVySWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFBhcmFtZXRlcnMoKS5nZXQoDQorCQkJCWNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsUGFsZXR0ZUZhY3RvcnkuVU5JVF9JRCk7DQorCQljb21yZWwuQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gY29tcmVsLkNvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCXdoaWxlIChjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsNCisJCQljb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY3IgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGNvbnRhaW5lcjsNCisJCWNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXIgaGVscGVyID0gY3IuZ2V0U2luZ2xlRmlsdGVySGVscGVyKGhlbHBlcklkKTsNCisJCWlmIChoZWxwZXIgIT0gbnVsbCAmJiAhY3IuZ2V0SGVscGVyKCkuY29udGFpbnMoaGVscGVyKSkgew0KKwkJCWNyLmdldEhlbHBlcigpLmFkZChoZWxwZXIpOw0KKwkJfQ0KKwkJY29tcmVsLlNpbmdsZUZpbHRlclVuaXQgbmV3RWxlbWVudDsNCisJCWlmIChoZWxwZXIgIT0gbnVsbCkgew0KKwkJCW5ld0VsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUZpbHRlclVuaXQoaGVscGVyKTsNCisJCX0gZWxzZSB7DQorCQkJbmV3RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmlsdGVyVW5pdCgpOw0KKwkJfQ0KKwkJLyogZW5kIG9mIGNoYW5nZSAqLw0KKw0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBvd25lciA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRIZWxwZXJVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVGaWx0ZXJVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTc2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKw0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBvd25lciA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRTaW5nbGVJbnB1dFBvcnRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI4NmVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKw0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG93bmVyID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVJbnB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDRDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3ZDFkMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlTaW5nbGVGZWF0dXJlVW5pdCBjb250YWluZXIgPSAoU2luZ2xlRmVhdHVyZVVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0SW5wdXRQb3J0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2luZ2xlSW5wdXRQb3J0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCk7DQorDQorCQlTaW5nbGVGZWF0dXJlVW5pdCBvd25lciA9IChTaW5nbGVGZWF0dXJlVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0SW5wdXRQb3J0KG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDVDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY1YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDVDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJTXVsdGlGZWF0dXJlVW5pdCBjb250YWluZXIgPSAoTXVsdGlGZWF0dXJlVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRJbnB1dFBvcnQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKTsNCisNCisJCU11bHRpRmVhdHVyZVVuaXQgb3duZXIgPSAoTXVsdGlGZWF0dXJlVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0SW5wdXRQb3J0KG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNiNTdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnQ2Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKTsNCisNCisJCVNpbmdsZVF1ZXVlZFVuaXQgb3duZXIgPSAoU2luZ2xlUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVJbnB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2ZTVhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKw0KKwkJU2VxdWVudGlhbFVuaXQgb3duZXIgPSAoU2VxdWVudGlhbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLmdldElucHV0UG9ydHMoKS5hZGQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlSW5wdXRQb3J0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OThjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydDhDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2luZ2xlSW5wdXRQb3J0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCk7DQorDQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5nZXRJbnB1dFBvcnRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI4NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUF0b21pY1VuaXQgb3duZXIgPSAoQXRvbWljVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJLyoNCisJCSAqIEJlZ2luIENoYW5nZXM6IE9ubHkgdGhlIEF0b21pY1JlZmFjdG9pcm5nSW5wdXRQb3J0cyBhcmUgYWxsb3dlZGVkDQorCQkgKi8NCisJCWlmIChvd25lci5nZXRJbnB1dFBvcnRzKCkuc2l6ZSgpICE9IG93bmVyLmdldE1vZGVsUmVmYWN0b3JpbmcoKQ0KKwkJCQkuZ2V0SW5wdXRQb3J0cygpLnNpemUoKSkgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJCS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKTsNCisNCisJCQlvd25lci5nZXRJbnB1dFBvcnRzKCkuYWRkKG5ld0VsZW1lbnQpOw0KKw0KKwkJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCQl9DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdDYW5jZWxsZWRDb21tYW5kUmVzdWx0KCk7DQorCQkvKg0KKwkJICogRW5kIENoYW5nZXMhDQorCQkgKi8NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlSW5wdXRQb3J0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlSW5wdXRQb3J0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTY2MjQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZUlucHV0UG9ydENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuTW9kZWxSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKTsNCisNCisJCU1vZGVsUmVmYWN0b3Jpbmcgb3duZXIgPSAoTW9kZWxSZWZhY3RvcmluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0SW5wdXRQb3J0cygpLmFkZChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVJbnB1dFBvcnQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzMyODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCVNpbmdsZUZpbHRlclVuaXQgY29udGFpbmVyID0gKFNpbmdsZUZpbHRlclVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0T3V0cHV0UG9ydCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZU91dHB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCk7DQorDQorCQlTaW5nbGVGaWx0ZXJVbml0IG93bmVyID0gKFNpbmdsZUZpbHRlclVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldE91dHB1dFBvcnQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlT3V0cHV0UG9ydCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZU91dHB1dFBvcnRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDRkNGUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZU91dHB1dFBvcnRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlTaW5nbGVGZWF0dXJlVW5pdCBjb250YWluZXIgPSAoU2luZ2xlRmVhdHVyZVVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0T3V0cHV0UG9ydCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZU91dHB1dFBvcnQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCk7DQorDQorCQlTaW5nbGVGZWF0dXJlVW5pdCBvd25lciA9IChTaW5nbGVGZWF0dXJlVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0T3V0cHV0UG9ydChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVPdXRwdXRQb3J0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmZTc3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IHNvdXJjZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgRU9iamVjdCB0YXJnZXQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIENvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LA0KKwkJCUVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCkgew0KKwkJc3VwZXIocmVxdWVzdC5nZXRMYWJlbCgpLCBudWxsLCByZXF1ZXN0KTsNCisJCXRoaXMuc291cmNlID0gc291cmNlOw0KKwkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7DQorCQljb250YWluZXIgPSBkZWR1Y2VDb250YWluZXIoc291cmNlLCB0YXJnZXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJaWYgKHNvdXJjZSA9PSBudWxsICYmIHRhcmdldCA9PSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZSAhPSBudWxsICYmIGZhbHNlID09IHNvdXJjZSBpbnN0YW5jZW9mIFNpbmdsZVBvcnQpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgZmFsc2UgPT0gdGFyZ2V0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0KSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJaWYgKGdldFNvdXJjZSgpID09IG51bGwpIHsNCisJCQlyZXR1cm4gdHJ1ZTsgLy8gbGluayBjcmVhdGlvbiBpcyBpbiBwcm9ncmVzczsgc291cmNlIGlzIG5vdCBkZWZpbmVkIHlldA0KKwkJfQ0KKwkJLy8gdGFyZ2V0IG1heSBiZSBudWxsIGhlcmUgYnV0IGl0J3MgcG9zc2libGUgdG8gY2hlY2sgY29uc3RyYWludA0KKwkJaWYgKGdldENvbnRhaW5lcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuZ2V0TGlua0NvbnN0cmFpbnRzKCkNCisJCQkJLmNhbkNyZWF0ZVNpbmdsZVBvcnRNYXBwaW5nXzQwMDEoZ2V0Q29udGFpbmVyKCksIGdldFNvdXJjZSgpLA0KKwkJCQkJCWdldFRhcmdldCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCWlmICghY2FuRXhlY3V0ZSgpKSB7DQorCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigNCisJCQkJCSJJbnZhbGlkIGFyZ3VtZW50cyBpbiBjcmVhdGUgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisNCisJCVNpbmdsZVBvcnRNYXBwaW5nIG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlU2luZ2xlUG9ydE1hcHBpbmcoKTsNCisJCWdldENvbnRhaW5lcigpLmdldFBvcnRNYXBwaW5ncygpLmFkZChuZXdFbGVtZW50KTsNCisJCW5ld0VsZW1lbnQuc2V0U291cmNlKGdldFNvdXJjZSgpKTsNCisJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KGdldFRhcmdldCgpKTsNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVQb3J0TWFwcGluZyBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRQYXJhbWV0ZXIoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdC5TT1VSQ0UsDQorCQkJCWdldFNvdXJjZSgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0UGFyYW1ldGVyKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QuVEFSR0VULA0KKwkJCQlnZXRUYXJnZXQoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlUG9ydCBnZXRTb3VyY2UoKSB7DQorCQlyZXR1cm4gKFNpbmdsZVBvcnQpIHNvdXJjZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUlucHV0UG9ydCBnZXRUYXJnZXQoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydCkgdGFyZ2V0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcG9zaXRlUmVmYWN0b3JpbmcgZ2V0Q29udGFpbmVyKCkgew0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBhcHByb2FjaCBpcyB0byB0cmF2ZXJzZSBhbmNlc3RvcnMgb2YgdGhlIHNvdXJjZSB0byBmaW5kIGluc3RhbmNlIG9mIGNvbnRhaW5lci4NCisJICogTW9kaWZ5IHdpdGggYXBwcm9wcmlhdGUgbG9naWMuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIENvbXBvc2l0ZVJlZmFjdG9yaW5nIGRlZHVjZUNvbnRhaW5lcihFT2JqZWN0IHNvdXJjZSwNCisJCQlFT2JqZWN0IHRhcmdldCkgew0KKwkJLy8gRmluZCBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG5ldyBsaW5rLg0KKwkJLy8gQ2xpbWIgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlIHNvdXJjZQ0KKwkJLy8gYW5kIHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mIHRoZSBjb250YWluZXIgY2xhc3MuDQorCQlmb3IgKEVPYmplY3QgZWxlbWVudCA9IHNvdXJjZTsgZWxlbWVudCAhPSBudWxsOyBlbGVtZW50ID0gZWxlbWVudA0KKwkJCQkuZUNvbnRhaW5lcigpKSB7DQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCQlyZXR1cm4gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBlbGVtZW50Ow0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhM2FmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIGludCByZW9yaWVudERpcmVjdGlvbjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgRU9iamVjdCBvbGRFbmQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIEVPYmplY3QgbmV3RW5kOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlzdXBlcihyZXF1ZXN0LmdldExhYmVsKCksIHJlcXVlc3QuZ2V0UmVsYXRpb25zaGlwKCksIHJlcXVlc3QpOw0KKwkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOw0KKwkJb2xkRW5kID0gcmVxdWVzdC5nZXRPbGRSZWxhdGlvbnNoaXBFbmQoKTsNCisJCW5ld0VuZCA9IHJlcXVlc3QuZ2V0TmV3UmVsYXRpb25zaGlwRW5kKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlpZiAoZmFsc2UgPT0gZ2V0RWxlbWVudFRvRWRpdCgpIGluc3RhbmNlb2YgU2luZ2xlUG9ydE1hcHBpbmcpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgew0KKwkJCXJldHVybiBjYW5SZW9yaWVudFNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsNCisJCQlyZXR1cm4gY2FuUmVvcmllbnRUYXJnZXQoKTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVvcmllbnRTb3VyY2UoKSB7DQorCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBTaW5nbGVQb3J0ICYmIG5ld0VuZCBpbnN0YW5jZW9mIFNpbmdsZVBvcnQpKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJU2luZ2xlSW5wdXRQb3J0IHRhcmdldCA9IGdldExpbmsoKS5nZXRUYXJnZXQoKTsNCisJCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGdldExpbmsoKQ0KKwkJCQkuZUNvbnRhaW5lcigpOw0KKwkJcmV0dXJuIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmdldExpbmtDb25zdHJhaW50cygpDQorCQkJCS5jYW5FeGlzdFNpbmdsZVBvcnRNYXBwaW5nXzQwMDEoY29udGFpbmVyLCBnZXRMaW5rKCksDQorCQkJCQkJZ2V0TmV3U291cmNlKCksIHRhcmdldCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50VGFyZ2V0KCkgew0KKwkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0ICYmIG5ld0VuZCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydCkpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlTaW5nbGVQb3J0IHNvdXJjZSA9IGdldExpbmsoKS5nZXRTb3VyY2UoKTsNCisJCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGdldExpbmsoKQ0KKwkJCQkuZUNvbnRhaW5lcigpOw0KKwkJcmV0dXJuIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmdldExpbmtDb25zdHJhaW50cygpDQorCQkJCS5jYW5FeGlzdFNpbmdsZVBvcnRNYXBwaW5nXzQwMDEoY29udGFpbmVyLCBnZXRMaW5rKCksIHNvdXJjZSwNCisJCQkJCQlnZXROZXdUYXJnZXQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlpZiAoIWNhbkV4ZWN1dGUoKSkgew0KKwkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oDQorCQkJCQkiSW52YWxpZCBhcmd1bWVudHMgaW4gcmVvcmllbnQgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7DQorCQkJcmV0dXJuIHJlb3JpZW50U291cmNlKCk7DQorCQl9DQorCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgew0KKwkJCXJldHVybiByZW9yaWVudFRhcmdldCgpOw0KKwkJfQ0KKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJZ2V0TGluaygpLnNldFNvdXJjZShnZXROZXdTb3VyY2UoKSk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRUYXJnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCWdldExpbmsoKS5zZXRUYXJnZXQoZ2V0TmV3VGFyZ2V0KCkpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVQb3J0TWFwcGluZyBnZXRMaW5rKCkgew0KKwkJcmV0dXJuIChTaW5nbGVQb3J0TWFwcGluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlUG9ydCBnZXRPbGRTb3VyY2UoKSB7DQorCQlyZXR1cm4gKFNpbmdsZVBvcnQpIG9sZEVuZDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZVBvcnQgZ2V0TmV3U291cmNlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVQb3J0KSBuZXdFbmQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVJbnB1dFBvcnQgZ2V0T2xkVGFyZ2V0KCkgew0KKwkJcmV0dXJuIChTaW5nbGVJbnB1dFBvcnQpIG9sZEVuZDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUlucHV0UG9ydCBnZXROZXdUYXJnZXQoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydCkgbmV3RW5kOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTJiZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgY29udGFpbmVyID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2luZ2xlUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXQoKTsNCisNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgb3duZXIgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0UmVmYWN0b3JpbmdVbml0KG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZVF1ZXVlZFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTk4MjYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IGNvbnRhaW5lciA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0UmVmYWN0b3JpbmdVbml0cygpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZVF1ZXVlZFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCk7DQorDQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgb3duZXIgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRSZWZhY3RvcmluZ1VuaXRzKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZVF1ZXVlZFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU5ZTliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQ0Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJQ29uZGl0aW9uYWxVbml0IGNvbnRhaW5lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0VGhlbigpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZVF1ZXVlZFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCk7DQorDQorCQlDb25kaXRpb25hbFVuaXQgb3duZXIgPSAoQ29uZGl0aW9uYWxVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRUaGVuKG5ld0VsZW1lbnQpOw0KKw0KKwkJZG9Db25maWd1cmUobmV3RWxlbWVudCwgbW9uaXRvciwgaW5mbyk7DQorDQorCQkoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLnNldE5ld0VsZW1lbnQobmV3RWxlbWVudCk7DQorCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQobmV3RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvQ29uZmlndXJlKFNpbmdsZVF1ZXVlZFVuaXQgbmV3RWxlbWVudCwNCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldEVsZW1lbnRUeXBlKCk7DQorCQlDb25maWd1cmVSZXF1ZXN0IGNvbmZpZ3VyZVJlcXVlc3QgPSBuZXcgQ29uZmlndXJlUmVxdWVzdCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBuZXdFbGVtZW50LCBlbGVtZW50VHlwZSk7DQorCQljb25maWd1cmVSZXF1ZXN0LnNldENsaWVudENvbnRleHQoKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q2xpZW50Q29udGV4dCgpKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3QuYWRkUGFyYW1ldGVycyhnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVycygpKTsNCisJCUlDb21tYW5kIGNvbmZpZ3VyZUNvbW1hbmQgPSBlbGVtZW50VHlwZQ0KKwkJCQkuZ2V0RWRpdENvbW1hbmQoY29uZmlndXJlUmVxdWVzdCk7DQorCQlpZiAoY29uZmlndXJlQ29tbWFuZCAhPSBudWxsICYmIGNvbmZpZ3VyZUNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJY29uZmlndXJlQ29tbWFuZC5leGVjdXRlKG1vbml0b3IsIGluZm8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9jb21tYW5kcy9TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZjMGVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDVDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlzdXBlcihyZXEuZ2V0TGFiZWwoKSwgbnVsbCwgcmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogRklYTUU6IHJlcGxhY2Ugd2l0aCBzZXRFbGVtZW50VG9FZGl0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0Q29udGFpbmVyKCk7DQorCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7DQorCQl9DQorCQlyZXR1cm4gY29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgew0KKwkJU2luZ2xlUXVldWVkVW5pdCBjb250YWluZXIgPSAoU2luZ2xlUXVldWVkVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRSZWZhY3RvcmluZ1VuaXQoKSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlTaW5nbGVRdWV1ZWRVbml0IG5ld0VsZW1lbnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlU2luZ2xlUXVldWVkVW5pdCgpOw0KKw0KKwkJU2luZ2xlUXVldWVkVW5pdCBvd25lciA9IChTaW5nbGVRdWV1ZWRVbml0KSBnZXRFbGVtZW50VG9FZGl0KCk7DQorCQlvd25lci5zZXRSZWZhY3RvcmluZ1VuaXQobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTZiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLlNlcXVlbnRpYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJc3VwZXIocmVxLmdldExhYmVsKCksIG51bGwsIHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEZJWE1FOiByZXBsYWNlIHdpdGggc2V0RWxlbWVudFRvRWRpdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZVF1ZXVlZFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCk7DQorDQorCQlTZXF1ZW50aWFsVW5pdCBvd25lciA9IChTZXF1ZW50aWFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuZ2V0UmVmYWN0b3JpbmdVbml0cygpLmFkZChuZXdFbGVtZW50KTsNCisJCW93bmVyLnVwZGF0ZVNlcUV4ZWN1dGlvbk9yZGVyKCk7DQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTIzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbmRpdGlvbmFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlDb25kaXRpb25hbFVuaXQgY29udGFpbmVyID0gKENvbmRpdGlvbmFsVW5pdCkgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJaWYgKGNvbnRhaW5lci5nZXRFbHNlKCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJU2luZ2xlUXVldWVkVW5pdCBuZXdFbGVtZW50ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXQoKTsNCisNCisJCUNvbmRpdGlvbmFsVW5pdCBvd25lciA9IChDb25kaXRpb25hbFVuaXQpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCW93bmVyLnNldEVsc2UobmV3RWxlbWVudCk7DQorDQorCQlkb0NvbmZpZ3VyZShuZXdFbGVtZW50LCBtb25pdG9yLCBpbmZvKTsNCisNCisJCSgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuc2V0TmV3RWxlbWVudChuZXdFbGVtZW50KTsNCisJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChuZXdFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9Db25maWd1cmUoU2luZ2xlUXVldWVkVW5pdCBuZXdFbGVtZW50LA0KKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKTsNCisJCUNvbmZpZ3VyZVJlcXVlc3QgY29uZmlndXJlUmVxdWVzdCA9IG5ldyBDb25maWd1cmVSZXF1ZXN0KA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5ld0VsZW1lbnQsIGVsZW1lbnRUeXBlKTsNCisJCWNvbmZpZ3VyZVJlcXVlc3Quc2V0Q2xpZW50Q29udGV4dCgoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDbGllbnRDb250ZXh0KCkpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5hZGRQYXJhbWV0ZXJzKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJzKCkpOw0KKwkJSUNvbW1hbmQgY29uZmlndXJlQ29tbWFuZCA9IGVsZW1lbnRUeXBlDQorCQkJCS5nZXRFZGl0Q29tbWFuZChjb25maWd1cmVSZXF1ZXN0KTsNCisJCWlmIChjb25maWd1cmVDb21tYW5kICE9IG51bGwgJiYgY29uZmlndXJlQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsNCisJCQljb25maWd1cmVDb21tYW5kLmV4ZWN1dGUobW9uaXRvciwgaW5mbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvU2luZ2xlUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzExYmFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL1NpbmdsZVF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUXVldWVkVW5pdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXN1cGVyKHJlcS5nZXRMYWJlbCgpLCBudWxsLCByZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBGSVhNRTogcmVwbGFjZSB3aXRoIHNldEVsZW1lbnRUb0VkaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBjb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGdldEVsZW1lbnRUb0VkaXQoKTsNCisJCWlmIChjb250YWluZXIuZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQorCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCVNpbmdsZVF1ZXVlZFVuaXQgbmV3RWxlbWVudCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCk7DQorDQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBvd25lciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgZ2V0RWxlbWVudFRvRWRpdCgpOw0KKwkJb3duZXIuc2V0TWFpblJlZmFjdG9yaW5nVW5pdChuZXdFbGVtZW50KTsNCisNCisJCWRvQ29uZmlndXJlKG5ld0VsZW1lbnQsIG1vbml0b3IsIGluZm8pOw0KKw0KKwkJKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5zZXROZXdFbGVtZW50KG5ld0VsZW1lbnQpOw0KKwkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KG5ld0VsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb0NvbmZpZ3VyZShTaW5nbGVRdWV1ZWRVbml0IG5ld0VsZW1lbnQsDQorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpOw0KKwkJQ29uZmlndXJlUmVxdWVzdCBjb25maWd1cmVSZXF1ZXN0ID0gbmV3IENvbmZpZ3VyZVJlcXVlc3QoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbmV3RWxlbWVudCwgZWxlbWVudFR5cGUpOw0KKwkJY29uZmlndXJlUmVxdWVzdC5zZXRDbGllbnRDb250ZXh0KCgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkNCisJCQkJLmdldENsaWVudENvbnRleHQoKSk7DQorCQljb25maWd1cmVSZXF1ZXN0LmFkZFBhcmFtZXRlcnMoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcnMoKSk7DQorCQlJQ29tbWFuZCBjb25maWd1cmVDb21tYW5kID0gZWxlbWVudFR5cGUNCisJCQkJLmdldEVkaXRDb21tYW5kKGNvbmZpZ3VyZVJlcXVlc3QpOw0KKwkJaWYgKGNvbmZpZ3VyZUNvbW1hbmQgIT0gbnVsbCAmJiBjb25maWd1cmVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCWNvbmZpZ3VyZUNvbW1hbmQuZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvY29tbWFuZHMvY3VzdG9tL0N1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL2N1c3RvbS9DdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I5YjNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2NvbW1hbmRzL2N1c3RvbS9DdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoqDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLmN1c3RvbTsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuSGVscGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLk1vZGVsUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLlBvcnQ7DQoraW1wb3J0IGNvbXJlbC5Qb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVBvcnRNYXBwaW5nOw0KK2ltcG9ydCBjb21yZWwudXRpbC5Db21yZWxVdGlsOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgR2Vycml0DQorICogU2VsYnN0ZGVmaW5pZXJ0ZXMgRGVzdHJveUVsZW1lbnRDb21tYW5kLCB1bSBldmVudHVlbGwgYmVzdGltbXRlIA0KKyAqIERpbmdlIG5vY2ggenUgbWFjaGVuLCBiZXZvciBkYXMgRWxlbWVudCB6ZXJzdPZydCB3aXJkLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQgZXh0ZW5kcyBEZXN0cm95RWxlbWVudENvbW1hbmQgew0KKw0KKwlib29sZWFuIGNvbmRpdGlvbiA9IHRydWU7DQorCU1vZGVsUmVmYWN0b3JpbmcgcmVmPSBudWxsOw0KKwlQb3J0IHAgPSBudWxsOw0KKwlIZWxwZXIgaGVscGVyPSBudWxsOw0KKwlFT2JqZWN0IGNvbnRhaW5lciA9IG51bGw7DQorCQ0KKwkNCisJcHVibGljIEN1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCxib29sZWFuIGNvbmRpdGlvbikgew0KKwkJc3VwZXIocmVxdWVzdCk7DQorCQl0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsNCisJCXRoaXMuY29udGFpbmVyID0gcmVxdWVzdC5nZXRDb250YWluZXIoKTsNCisJfQ0KKwkNCisJcHVibGljIEN1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCxQb3J0IHBvcnQsIGJvb2xlYW4gY29uZGl0aW9uKSB7DQorCQlzdXBlcihyZXF1ZXN0KTsNCisJCXRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOw0KKwkJdGhpcy5jb250YWluZXIgPSByZXF1ZXN0LmdldENvbnRhaW5lcigpOw0KKwkJdGhpcy5wPXBvcnQ7DQorCX0NCisJDQorCXB1YmxpYyBDdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QsTW9kZWxSZWZhY3RvcmluZyByZWYpIHsNCisJCXN1cGVyKHJlcXVlc3QpOw0KKwkJdGhpcy5yZWY9cmVmOw0KKwkJdGhpcy5jb250YWluZXIgPSByZXF1ZXN0LmdldENvbnRhaW5lcigpOw0KKwl9DQorCQ0KKwlwdWJsaWMgQ3VzdG9tRGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXF1ZXN0LEhlbHBlciBoZWxwZXIpIHsNCisJCXN1cGVyKHJlcXVlc3QpOw0KKwkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7DQorCQl0aGlzLmNvbnRhaW5lciA9IHJlcXVlc3QuZ2V0Q29udGFpbmVyKCk7DQorCX0NCisNCisJLyogKG5vbi1KYXZhZG9jKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kI2NhbkV4ZWN1dGUoKQ0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7DQorCQlyZXR1cm4gY29uZGl0aW9uOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwNCisJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJDQorCQlDb21tYW5kUmVzdWx0IHJlc3VsdCA9IHN1cGVyLmRvRXhlY3V0ZVdpdGhSZXN1bHQobW9uaXRvciwgaW5mbyk7DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZylDb21yZWxVdGlsLmdldENvbnRhaW5lZENvbXBvc2l0ZVJlZmFjdG9yaW5nKGNvbnRhaW5lcik7DQorCQlBcnJheUxpc3Q8UG9ydE1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxQb3J0TWFwcGluZz4oKTsNCisJCUFycmF5TGlzdDxQb3J0PiBwb3J0cyA9IG5ldyBBcnJheUxpc3Q8UG9ydD4oKTsNCisJCWlmKHJlZiAhPSBudWxsKSB7DQorCQkJQXRvbWljVW5pdCBjb250ZXh0ID0gKEF0b21pY1VuaXQpIGdldEVsZW1lbnRUb0Rlc3Ryb3koKTsNCisJCQlwb3J0cy5hZGRBbGwoY29udGV4dC5nZXRJbnB1dFBvcnRzKCkpOw0KKwkJCWZvcihQb3J0TWFwcGluZyBtIDogY3IuZ2V0UG9ydE1hcHBpbmdzKCkpIHsNCisJCQkJaWYocG9ydHMuY29udGFpbnMobS5nZXRTb3VyY2UoKSkgfHwgcG9ydHMuY29udGFpbnMobS5nZXRUYXJnZXQoKSkpIHsNCisJCQkJCXNldFNvdXJjZVRhcmdldE51bGwobSk7DQorCQkJCQltYXBwaW5ncy5hZGQobSk7DQorCQkJCX0NCisJCQl9DQorCQkJY3IuZ2V0UG9ydE1hcHBpbmdzKCkucmVtb3ZlQWxsKG1hcHBpbmdzKTsNCisJCQljci5nZXRNb2RlbFJlZmFjdG9yaW5ncygpLnJlbW92ZShyZWYpOw0KKwkJfQ0KKwkJaWYoaGVscGVyICE9IG51bGwpIHsNCisJCQlIZWxwZXJVbml0IGNvbnRleHQgPSAoSGVscGVyVW5pdCkgZ2V0RWxlbWVudFRvRGVzdHJveSgpOw0KKwkJCXBvcnRzLmFkZChjb250ZXh0LmdldElucHV0UG9ydCgpKTsNCisJCQlwb3J0cy5hZGQoY29udGV4dC5nZXRPdXRwdXRQb3J0KCkpOw0KKwkJCWZvcihQb3J0TWFwcGluZyBtIDogY3IuZ2V0UG9ydE1hcHBpbmdzKCkpIHsNCisJCQkJaWYocG9ydHMuY29udGFpbnMobS5nZXRTb3VyY2UoKSkgfHwgcG9ydHMuY29udGFpbnMobS5nZXRUYXJnZXQoKSkpIHsNCisJCQkJCXNldFNvdXJjZVRhcmdldE51bGwobSk7DQorCQkJCQltYXBwaW5ncy5hZGQobSk7DQorCQkJCX0NCisJCQl9DQorCQkJY3IuZ2V0UG9ydE1hcHBpbmdzKCkucmVtb3ZlQWxsKG1hcHBpbmdzKTsNCisJCQljci5nZXRIZWxwZXIoKS5yZW1vdmUoaGVscGVyKTsNCisJCX0NCisJCWlmKHAgIT0gbnVsbCkgew0KKwkJCWZvcihQb3J0TWFwcGluZyBtIDogY3IuZ2V0UG9ydE1hcHBpbmdzKCkpIHsNCisJCQkJaWYocG9ydHMgPT0gbS5nZXRTb3VyY2UoKSB8fCBwID09IG0uZ2V0VGFyZ2V0KCkpIHsNCisJCQkJCXNldFNvdXJjZVRhcmdldE51bGwobSk7DQorCQkJCQltYXBwaW5ncy5hZGQobSk7DQorCQkJCX0NCisJCQl9DQorCQkJY3IuZ2V0UG9ydE1hcHBpbmdzKCkucmVtb3ZlQWxsKG1hcHBpbmdzKTsNCisJCX0NCisJCQ0KKwkJY3IucmVtb3ZlVW51c2VkTW9kZWxSZWZhY3RvcmluZ3MoKTsNCisJCWNyLnJlbW92ZVVudXNlZEhlbHBlcigpOw0KKw0KKwkJDQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorCQ0KKwlwcml2YXRlIHZvaWQgc2V0U291cmNlVGFyZ2V0TnVsbChQb3J0TWFwcGluZyBtYXBwaW5nKSB7DQorCQkNCisJCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgU2luZ2xlUG9ydE1hcHBpbmcpIHsNCisJCQlTaW5nbGVQb3J0TWFwcGluZyBtID0gKFNpbmdsZVBvcnRNYXBwaW5nKSBtYXBwaW5nOw0KKwkJCW0uc2V0U291cmNlKG51bGwpOw0KKwkJCW0uc2V0VGFyZ2V0KG51bGwpOw0KKwkJfQ0KKwkJaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBNdWx0aVBvcnRNYXBwaW5nKSB7DQorCQkJTXVsdGlQb3J0TWFwcGluZyBtID0gKE11bHRpUG9ydE1hcHBpbmcpIG1hcHBpbmc7DQorCQkJbS5zZXRTb3VyY2UobnVsbCk7DQorCQkJbS5zZXRUYXJnZXQobnVsbCk7DQorCQl9DQorCQlpZiAobWFwcGluZyBpbnN0YW5jZW9mIE11bHRpU2luZ2xlUG9ydE1hcHBpbmcpIHsNCisJCQlNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIG0gPSAoTXVsdGlTaW5nbGVQb3J0TWFwcGluZykgbWFwcGluZzsNCisJCQltLnNldFNvdXJjZShudWxsKTsNCisJCQltLnNldFRhcmdldChudWxsKTsNCisJCX0NCisJfQ0KKwkNCisJDQorCQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9BdG9taWNVbml0RWRpdEhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQXRvbWljVW5pdEVkaXRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgwYzcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQXRvbWljVW5pdEVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLk1vZGVsUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuY3VzdG9tLkN1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAocmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKSBpbnN0YW5jZW9mIEF0b21pY1VuaXQpIHsNCisJCQlBdG9taWNVbml0IGNvbnRleHQgPSAoQXRvbWljVW5pdCkgcmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF0b21pY1VuaXQ6ICIgKyBjb250ZXh0KTsNCisJCQlNb2RlbFJlZmFjdG9yaW5nIG1vZGVsUmVmYWN0b3JpbmcgPSBjb250ZXh0LmdldE1vZGVsUmVmYWN0b3JpbmcoKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGVsUmVmYWN0b3Jpbmc6ICIgKyBtb2RlbFJlZmFjdG9yaW5nKTsNCisJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgbW9kZWxSZWZhY3RvcmluZw0KKwkJCQkJLmVDb250YWluZXIoKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBvc2l0ZVJlZmFjdG9yaW5nOiAiICsgY3IpOw0KKwkJCWlmIChjciAhPSBudWxsKSB7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW4gdXNlPzogIiArIGNyLm1vZGVsUmVmYWN0b3JpbmdJblVzZShtb2RlbFJlZmFjdG9yaW5nLCBjb250ZXh0KSk7DQorCQkJCWlmICghY3IubW9kZWxSZWZhY3RvcmluZ0luVXNlKG1vZGVsUmVmYWN0b3JpbmcsIGNvbnRleHQpKSB7DQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybjogbmV3IEN1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZCIpOw0KKwkJCQkJcmV0dXJuIG5ldyBDdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQocmVxLA0KKwkJCQkJCQltb2RlbFJlZmFjdG9yaW5nKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCVN5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuOiBzdXBlciBjYWxsIik7DQorCQlyZXR1cm4gc3VwZXIuZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL0NhcnRlc2lhblF1ZXVlZFVuaXRFZGl0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0YWNmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL0NhcnRlc2lhblF1ZXVlZFVuaXRFZGl0SGVscGVyLmphdmEKQEAgLTAsMCArMSwxMCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVyczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL0NvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YmIyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9Db21yZWxCYXNlRWRpdEhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQ29tcmVsQmFzZUVkaXRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWMzNjFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQ29tcmVsQmFzZUVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVyczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuSUVkaXRIZWxwZXJBZHZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuUG9ydDsNCitpbXBvcnQgY29tcmVsLnV0aWwuQ29tcmVsVXRpbDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbEJhc2VFZGl0SGVscGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfUE9MSUNZX0NPTU1BTkQgPSAiZWRpdCBwb2xpY3kgY29tbWFuZCI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfRUxFTUVOVF9UWVBFID0gImNvbnRleHQgZWxlbWVudCB0eXBlIjsgLy8kTk9OLU5MUy0xJA0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElFZGl0SGVscGVyQWR2aWNlW10gZ2V0RWRpdEhlbHBlckFkdmljZShJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKHJlcS5nZXRQYXJhbWV0ZXIoQ09OVEVYVF9FTEVNRU5UX1RZUEUpIGluc3RhbmNlb2YgSUVsZW1lbnRUeXBlKSB7DQorCQkJcmV0dXJuIEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFZGl0SGVscGVyQWR2aWNlKA0KKwkJCQkJKElFbGVtZW50VHlwZSkgcmVxLmdldFBhcmFtZXRlcihDT05URVhUX0VMRU1FTlRfVFlQRSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldEVkaXRIZWxwZXJBZHZpY2UocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDb21tYW5kIGdldEluc3RlYWRDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7DQorCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7DQorCQlyZXEuc2V0UGFyYW1ldGVyKEVESVRfUE9MSUNZX0NPTU1BTkQsIG51bGwpOw0KKwkJSUNvbW1hbmQgZWhDb21tYW5kID0gc3VwZXIuZ2V0SW5zdGVhZENvbW1hbmQocmVxKTsNCisJCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgew0KKwkJCXJldHVybiBlaENvbW1hbmQ7DQorCQl9DQorCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsNCisJCQlyZXR1cm4gZXBDb21tYW5kOw0KKwkJfQ0KKwkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7DQorCQljb21tYW5kLmFkZChlcENvbW1hbmQpOw0KKwkJY29tbWFuZC5hZGQoZWhDb21tYW5kKTsNCisJCXJldHVybiBjb21tYW5kOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IENvbXJlbFV0aWwNCisJCQkJLmdldENvbnRhaW5lZENvbXBvc2l0ZVJlZmFjdG9yaW5nKHJlcS5nZXRDb250YWluZXIoKSk7DQorCQlpZiAoY3IgIT0gbnVsbCkgew0KKwkJCWNyLnVwZGF0ZVZpc3VhbGl6YXRpb24oKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gQ29tcmVsVXRpbA0KKwkJCQkuZ2V0Q29udGFpbmVkQ29tcG9zaXRlUmVmYWN0b3JpbmcocmVxLmdldENvbnRhaW5lcigpKTsNCisJCWlmIChjciAhPSBudWxsKSB7DQorCQkJY3IudXBkYXRlVmlzdWFsaXphdGlvbigpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChyZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpIGluc3RhbmNlb2YgUG9ydCkgew0KKwkJCXJldHVybiBFZGl0SGVscGVyVXRpbC5nZXRQb3J0RGVzdHJveShyZXEpOw0KKwkJfQ0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY3IgPSBDb21yZWxVdGlsDQorCQkJCS5nZXRDb250YWluZWRDb21wb3NpdGVSZWZhY3RvcmluZyhyZXEuZ2V0Q29udGFpbmVyKCkpOw0KKwkJaWYgKGNyICE9IG51bGwpIHsNCisJCQljci51cGRhdGVWaXN1YWxpemF0aW9uKCk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gQ29tcmVsVXRpbA0KKwkJCQkuZ2V0Q29udGFpbmVkQ29tcG9zaXRlUmVmYWN0b3JpbmcocmVxLmdldENvbnRhaW5lcigpKTsNCisJCWlmIChjciAhPSBudWxsKSB7DQorCQkJY3IudXBkYXRlVmlzdWFsaXphdGlvbigpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0RmVhdHVyZShDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gQ29tcmVsVXRpbA0KKwkJCQkuZ2V0Q29udGFpbmVkQ29tcG9zaXRlUmVmYWN0b3JpbmcocmVxLmdldENvbnRhaW5lcigpKTsNCisJCWlmIChjciAhPSBudWxsKSB7DQorCQkJY3IudXBkYXRlVmlzdWFsaXphdGlvbigpOw0KKwkJfQ0KKwkJc3VwZXIuaW5pdGlhbGl6ZURlZmF1bHRGZWF0dXJlKHJlcSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQ29uZGl0aW9uQ2hlY2tFZGl0SGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9Db25kaXRpb25DaGVja0VkaXRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzY1NmEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQ29uZGl0aW9uQ2hlY2tFZGl0SGVscGVyLmphdmEKQEAgLTAsMCArMSwxMCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVyczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrRWRpdEhlbHBlciBleHRlbmRzIENvbXJlbEJhc2VFZGl0SGVscGVyIHsNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQ29uZGl0aW9uYWxVbml0RWRpdEhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvQ29uZGl0aW9uYWxVbml0RWRpdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMWY1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9Db25kaXRpb25hbFVuaXRFZGl0SGVscGVyLmphdmEKQEAgLTAsMCArMSwxMCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVyczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEVkaXRIZWxwZXIgZXh0ZW5kcyBDb21yZWxCYXNlRWRpdEhlbHBlciB7DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL0VkaXRIZWxwZXJVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9FZGl0SGVscGVyVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjNkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9FZGl0SGVscGVyVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlPdXRwdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCisNCitwdWJsaWMgY2xhc3MgRWRpdEhlbHBlclV0aWwgew0KKw0KKwkNCisJcHVibGljIHN0YXRpYyBJQ29tbWFuZCBnZXRQb3J0RGVzdHJveShEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlDb21yZWxCYXNlRWRpdEhlbHBlciBoOw0KKwkJaWYocmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKSBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydCl7DQorCQkJaCA9IG5ldyBTaW5nbGVJbnB1dFBvcnRFZGl0SGVscGVyKCk7DQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbjogZ2V0UG9ydERlc3Ryb3koRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkiKTsNCisJCQlyZXR1cm4gaC5nZXREZXN0cm95RWxlbWVudENvbW1hbmQocmVxKTsNCisJCX0NCisJCWlmKHJlcS5nZXRFbGVtZW50VG9EZXN0cm95KCkgaW5zdGFuY2VvZiBTaW5nbGVPdXRwdXRQb3J0KXsNCisJCQloID0gbmV3IFNpbmdsZU91dHB1dFBvcnRFZGl0SGVscGVyKCk7DQorCQkJcmV0dXJuIGguZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSk7DQorCQl9DQorCQlpZihyZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpIGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQpew0KKwkJCWggPSBuZXcgTXVsdGlJbnB1dFBvcnRFZGl0SGVscGVyKCk7DQorCQkJcmV0dXJuIGguZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSk7DQorCQl9DQorCQlpZihyZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpIGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0KXsNCisJCQloID0gbmV3IE11bHRpT3V0cHV0UG9ydEVkaXRIZWxwZXIoKTsNCisJCQlyZXR1cm4gaC5nZXREZXN0cm95RWxlbWVudENvbW1hbmQocmVxKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwkJDQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvTXVsdGlGZWF0dXJlVW5pdEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpRmVhdHVyZVVuaXRFZGl0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1ZDMzZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpRmVhdHVyZVVuaXRFZGl0SGVscGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVyczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkhlbHBlcjsNCitpbXBvcnQgY29tcmVsLkhlbHBlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLmN1c3RvbS5DdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0RWRpdEhlbHBlciBleHRlbmRzIENvbXJlbEJhc2VFZGl0SGVscGVyIHsNCisNCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKHJlcS5nZXRFbGVtZW50VG9EZXN0cm95KCkgaW5zdGFuY2VvZiBIZWxwZXJVbml0KSB7DQorCQkJSGVscGVyVW5pdCBjb250ZXh0ID0gKEhlbHBlclVuaXQpIHJlcS5nZXRFbGVtZW50VG9EZXN0cm95KCk7DQorCQkJSGVscGVyIGhlbHBlciA9ICgoTXVsdGlGZWF0dXJlVW5pdCkgY29udGV4dCkNCisJCQkJCS5nZXRNdWx0aUZlYXR1cmVIZWxwZXIoKTsNCisJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgaGVscGVyDQorCQkJCQkuZUNvbnRhaW5lcigpOw0KKwkJCWlmIChjciAhPSBudWxsKSB7DQorCQkJCWlmICghY3IuaGVscGVySW5Vc2UoaGVscGVyLCBjb250ZXh0KSkgew0KKwkJCQkJcmV0dXJuIG5ldyBDdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQocmVxLCBoZWxwZXIpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpRmlsdGVyVW5pdEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpRmlsdGVyVW5pdEVkaXRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2U1NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvTXVsdGlGaWx0ZXJVbml0RWRpdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlGaWx0ZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLmN1c3RvbS5DdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAocmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKSBpbnN0YW5jZW9mIEhlbHBlclVuaXQpIHsNCisJCQlIZWxwZXJVbml0IGNvbnRleHQgPSAoSGVscGVyVW5pdCkgcmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsNCisJCQlIZWxwZXIgaGVscGVyID0gKChNdWx0aUZpbHRlclVuaXQpIGNvbnRleHQpLmdldE11bHRpRmlsdGVySGVscGVyKCk7DQorCQkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgcmVmU3lzID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBoZWxwZXINCisJCQkJCS5lQ29udGFpbmVyKCk7DQorCQkJaWYgKHJlZlN5cyAhPSBudWxsKSB7DQorCQkJCWlmICghcmVmU3lzLmhlbHBlckluVXNlKGhlbHBlciwgY29udGV4dCkpIHsNCisJCQkJCXJldHVybiBuZXcgQ3VzdG9tRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSwgaGVscGVyKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXJldHVybiBzdXBlci5nZXREZXN0cm95RWxlbWVudENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9NdWx0aUlucHV0UG9ydEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpSW5wdXRQb3J0RWRpdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNWJiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9NdWx0aUlucHV0UG9ydEVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5GaWx0ZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuUG9ydDsNCitpbXBvcnQgY29tcmVsLlF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuY3VzdG9tLkN1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0RWRpdEhlbHBlciBleHRlbmRzIENvbXJlbEJhc2VFZGl0SGVscGVyIHsNCisNCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSByZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpLmVDb250YWluZXIoKTsNCisJCWJvb2xlYW4gY29uZGl0aW9uID0gIShjb250YWluZXIgaW5zdGFuY2VvZiBRdWV1ZWRVbml0KQ0KKwkJCQl8fCBjb250YWluZXIgPT0gbnVsbDsNCisJCWNvbmRpdGlvbiAmPSAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIEZpbHRlclVuaXQpOw0KKwkJcmV0dXJuIG5ldyBDdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQocmVxLA0KKwkJCQkoUG9ydCkgcmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKSwgY29uZGl0aW9uKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9NdWx0aU91dHB1dFBvcnRFZGl0SGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9NdWx0aU91dHB1dFBvcnRFZGl0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0OTg4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpT3V0cHV0UG9ydEVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuUG9ydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5jdXN0b20uQ3VzdG9tRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0RWRpdEhlbHBlciBleHRlbmRzIENvbXJlbEJhc2VFZGl0SGVscGVyIHsNCisNCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSByZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpLmVDb250YWluZXIoKTsNCisJCWJvb2xlYW4gY29uZGl0aW9uID0gIShjb250YWluZXIgaW5zdGFuY2VvZiBIZWxwZXJVbml0KQ0KKwkJCQl8fCBjb250YWluZXIgPT0gbnVsbDsNCisJCXJldHVybiBuZXcgQ3VzdG9tRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSwNCisJCQkJKFBvcnQpIHJlcS5nZXRFbGVtZW50VG9EZXN0cm95KCksIGNvbmRpdGlvbik7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvTXVsdGlQb3J0TWFwcGluZ0VkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpUG9ydE1hcHBpbmdFZGl0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhODE4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL011bHRpUG9ydE1hcHBpbmdFZGl0SGVscGVyLmphdmEKQEAgLTAsMCArMSwxMCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVyczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpUG9ydE1hcHBpbmdFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdEhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTBmYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRIZWxwZXIgZXh0ZW5kcyBDb21yZWxCYXNlRWRpdEhlbHBlciB7DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1BhcmFsbGVsUXVldWVkVW5pdEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1BhcmFsbGVsUXVldWVkVW5pdEVkaXRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVmMjljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvUGFyYWxsZWxRdWV1ZWRVbml0RWRpdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TZXF1ZW50aWFsVW5pdEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1NlcXVlbnRpYWxVbml0RWRpdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmN2NiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TZXF1ZW50aWFsVW5pdEVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVGZWF0dXJlVW5pdEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1NpbmdsZUZlYXR1cmVVbml0RWRpdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTY4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVGZWF0dXJlVW5pdEVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuSGVscGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLmN1c3RvbS5DdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdEVkaXRIZWxwZXIgZXh0ZW5kcyBDb21yZWxCYXNlRWRpdEhlbHBlciB7DQorDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChyZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpIGluc3RhbmNlb2YgSGVscGVyVW5pdCkgew0KKwkJCUhlbHBlclVuaXQgY29udGV4dCA9IChIZWxwZXJVbml0KSByZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpOw0KKwkJCUhlbHBlciBoZWxwZXIgPSAoKFNpbmdsZUZlYXR1cmVVbml0KSBjb250ZXh0KQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVIZWxwZXIoKTsNCisJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgaGVscGVyDQorCQkJCQkuZUNvbnRhaW5lcigpOw0KKwkJCWlmIChjciAhPSBudWxsKSB7DQorCQkJCWlmICghY3IuaGVscGVySW5Vc2UoaGVscGVyLCBjb250ZXh0KSkgew0KKwkJCQkJcmV0dXJuIG5ldyBDdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQocmVxLCBoZWxwZXIpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1NpbmdsZUZpbHRlclVuaXRFZGl0SGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVGaWx0ZXJVbml0RWRpdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzgxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVGaWx0ZXJVbml0RWRpdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LmhlbHBlcnM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5jdXN0b20uQ3VzdG9tRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdEVkaXRIZWxwZXIgZXh0ZW5kcyBDb21yZWxCYXNlRWRpdEhlbHBlciB7DQorDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChyZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpIGluc3RhbmNlb2YgSGVscGVyVW5pdCkgew0KKwkJCUhlbHBlclVuaXQgY29udGV4dCA9IChIZWxwZXJVbml0KSByZXEuZ2V0RWxlbWVudFRvRGVzdHJveSgpOw0KKwkJCUhlbHBlciBoZWxwZXIgPSAoKFNpbmdsZUZpbHRlclVuaXQpIGNvbnRleHQpDQorCQkJCQkuZ2V0U2luZ2xlRmlsdGVySGVscGVyKCk7DQorCQkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY3IgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGhlbHBlcg0KKwkJCQkJLmVDb250YWluZXIoKTsNCisJCQlpZiAoY3IgIT0gbnVsbCkgew0KKwkJCQlpZiAoIWNyLmhlbHBlckluVXNlKGhlbHBlciwgY29udGV4dCkpIHsNCisJCQkJCXJldHVybiBuZXcgQ3VzdG9tRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSwgaGVscGVyKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXJldHVybiBzdXBlci5nZXREZXN0cm95RWxlbWVudENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVJbnB1dFBvcnRFZGl0SGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVJbnB1dFBvcnRFZGl0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0ZGU5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1NpbmdsZUlucHV0UG9ydEVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5BdG9taWNVbml0Ow0KK2ltcG9ydCBjb21yZWwuSGVscGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLlBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuY3VzdG9tLkN1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEVkaXRIZWxwZXIgZXh0ZW5kcyBDb21yZWxCYXNlRWRpdEhlbHBlciB7DQorDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCUVPYmplY3QgY29udGFpbmVyID0gcmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKS5lQ29udGFpbmVyKCk7DQorCQlib29sZWFuIGNvbmRpdGlvbiA9ICEoY29udGFpbmVyIGluc3RhbmNlb2YgQXRvbWljVW5pdCkNCisJCQkJfHwgY29udGFpbmVyID09IG51bGw7DQorCQljb25kaXRpb24gJj0gIShjb250YWluZXIgaW5zdGFuY2VvZiBIZWxwZXJVbml0KTsNCisJCXJldHVybiBuZXcgQ3VzdG9tRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSwNCisJCQkJKFBvcnQpIHJlcS5nZXRFbGVtZW50VG9EZXN0cm95KCksIGNvbmRpdGlvbik7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvU2luZ2xlT3V0cHV0UG9ydEVkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1NpbmdsZU91dHB1dFBvcnRFZGl0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljZDE1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1NpbmdsZU91dHB1dFBvcnRFZGl0SGVscGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVyczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuSGVscGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLlBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuY3VzdG9tLkN1c3RvbURlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnRFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KKw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9IHJlcS5nZXRFbGVtZW50VG9EZXN0cm95KCkuZUNvbnRhaW5lcigpOw0KKwkJYm9vbGVhbiBjb25kaXRpb24gPSAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhlbHBlclVuaXQpDQorCQkJCXx8IGNvbnRhaW5lciA9PSBudWxsOw0KKwkJcmV0dXJuIG5ldyBDdXN0b21EZXN0cm95RWxlbWVudENvbW1hbmQocmVxLA0KKwkJCQkoUG9ydCkgcmVxLmdldEVsZW1lbnRUb0Rlc3Ryb3koKSwgY29uZGl0aW9uKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVQb3J0TWFwcGluZ0VkaXRIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9oZWxwZXJzL1NpbmdsZVBvcnRNYXBwaW5nRWRpdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWVkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVQb3J0TWFwcGluZ0VkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUG9ydE1hcHBpbmdFZGl0SGVscGVyIGV4dGVuZHMgQ29tcmVsQmFzZUVkaXRIZWxwZXIgew0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvaGVscGVycy9TaW5nbGVRdWV1ZWRVbml0RWRpdEhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvU2luZ2xlUXVldWVkVW5pdEVkaXRIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTljODg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L2hlbHBlcnMvU2luZ2xlUXVldWVkVW5pdEVkaXRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5oZWxwZXJzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdEVkaXRIZWxwZXIgZXh0ZW5kcyBDb21yZWxCYXNlRWRpdEhlbHBlciB7DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9BdG9taWNVbml0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZDZlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5BdG9taWNVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQXRvbWljVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0MkVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAzNDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBBdG9taWNVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBBdG9taWNVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IEF0b21pY1VuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChBdG9taWNVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdExhYmVsVHlwZTJFZGl0UGFydCkgew0KKwkJCSgoQXRvbWljVW5pdExhYmVsVHlwZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQXRvbWljVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBBdG9taWNVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkF0b21pY1VuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9BdG9taWNVbml0M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwNWIzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9BdG9taWNVbml0M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzMzQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkF0b21pY1VuaXQzQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5BdG9taWNVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXQzRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDQ5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IEF0b21pY1VuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IEF0b21pY1VuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgQXRvbWljVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKEF0b21pY1VuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBdG9taWNVbml0TGFiZWxUeXBlM0VkaXRQYXJ0KSB7DQorCQkJKChBdG9taWNVbml0TGFiZWxUeXBlM0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdExhYmVsVHlwZTNFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKEF0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBBdG9taWNVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEF0b21pY1VuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiQXRvbWljVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDAwYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDMzNCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQXRvbWljVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkF0b21pY1VuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDRFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNjg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0NEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQXRvbWljVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQXRvbWljVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBBdG9taWNVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoQXRvbWljVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXRMYWJlbFR5cGU0RWRpdFBhcnQpIHsNCisJCQkoKEF0b21pY1VuaXRMYWJlbFR5cGU0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBdG9taWNVbml0TGFiZWxUeXBlNEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQXRvbWljVW5pdExhYmVsVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIEF0b21pY1VuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgQXRvbWljVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJBdG9taWNVbml0Iik7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9BdG9taWNVbml0NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjg1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5BdG9taWNVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQXRvbWljVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0NUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA3NDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXQ1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBBdG9taWNVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBBdG9taWNVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IEF0b21pY1VuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChBdG9taWNVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdExhYmVsVHlwZTVFZGl0UGFydCkgew0KKwkJCSgoQXRvbWljVW5pdExhYmVsVHlwZTVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQXRvbWljVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBBdG9taWNVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkF0b21pY1VuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9BdG9taWNVbml0NkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5MTRmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9BdG9taWNVbml0NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzMzQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkF0b21pY1VuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5BdG9taWNVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXQ2RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDc3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IEF0b21pY1VuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IEF0b21pY1VuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgQXRvbWljVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKEF0b21pY1VuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBdG9taWNVbml0TGFiZWxUeXBlNkVkaXRQYXJ0KSB7DQorCQkJKChBdG9taWNVbml0TGFiZWxUeXBlNkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdExhYmVsVHlwZTZFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKEF0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBBdG9taWNVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEF0b21pY1VuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiQXRvbWljVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXQ3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjYwYWZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXQ3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDMzOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQXRvbWljVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkF0b21pY1VuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDdFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNzg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0N0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQXRvbWljVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQXRvbWljVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCUF0b21pY1VuaXRGaWd1cmUgZmlndXJlID0gbmV3IEF0b21pY1VuaXRGaWd1cmUoKTsNCisJCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChBdG9taWNVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdExhYmVsVHlwZTdFZGl0UGFydCkgew0KKwkJCSgoQXRvbWljVW5pdExhYmVsVHlwZTdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXRMYWJlbFR5cGU3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQXRvbWljVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBBdG9taWNVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkF0b21pY1VuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNWQ3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNDkgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQXRvbWljVW5pdENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQXRvbWljVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBBdG9taWNVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IEF0b21pY1VuaXRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBBdG9taWNVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoQXRvbWljVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXRMYWJlbFR5cGVFZGl0UGFydCkgew0KKwkJCSgoQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCWlmIChldmVudC5nZXROb3RpZmllcigpID09IGdldE1vZGVsKCkNCisJCQkJJiYgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpDQorCQkJCQkJLmVxdWFscyhldmVudC5nZXRGZWF0dXJlKCkpKSB7DQorCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBBdG9taWNVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEF0b21pY1VuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiQXRvbWljVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZTJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc5OGFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDI3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzAzNCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZTNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgxYTFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDM0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZTRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDlmMTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRMYWJlbFR5cGU0RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDQ4Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRMYWJlbFR5cGU0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA2OCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZTVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTMxOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDUwOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZTZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGNhNWFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDUzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZTdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODNmMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0F0b21pY1VuaXRMYWJlbFR5cGU3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRMYWJlbFR5cGU3RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDU0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRMYWJlbFR5cGU3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3OCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwYjUxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9BdG9taWNVbml0TGFiZWxUeXBlRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRMYWJlbFR5cGVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwODU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzIwMDcsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDliMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LkNhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuY3VzdG9tLkxhYmVsczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsDQorCQkJCW5ldyBPcGVuRGlhZ3JhbUVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQpIHsNCisJCQkoKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUNCisJCQkJCS5zZXRUZXh0KCJDYXJ0ZXNpYW5RdWV1ZWRVbml0Iik7DQorCQkJZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQkJZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZQ0KKwkJCQkJLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMGQyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5DYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5PcGVuRGlhZ3JhbUVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDA3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0KSB7DQorCQkJKChDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlDQorCQkJCQkuc2V0VGV4dCgiQ2FydGVzaWFuUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUNCisJCQkJCS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDJkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0RWRpdFBhcnQuQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAyNTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUoKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wSGVscGVyID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkNCisJCQkJLmdldCgxKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wUmVmID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkuZ2V0KDIpOw0KKwkJTGFiZWxzLnNldExhYmVscyhjb21wSGVscGVyLCBjb21wUmVmLCB0cnVlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCkgew0KKwkJCSgoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZQ0KKwkJCQkJLnNldFRleHQoIkNhcnRlc2lhblF1ZXVlZFVuaXQiKTsNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlDQorCQkJCQkuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQ2NjlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LkNhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuY3VzdG9tLkxhYmVsczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMjk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsDQorCQkJCW5ldyBPcGVuRGlhZ3JhbUVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQpIHsNCisJCQkoKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUNCisJCQkJCS5zZXRUZXh0KCJDYXJ0ZXNpYW5RdWV1ZWRVbml0Iik7DQorCQkJZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQkJZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZQ0KKwkJCQkJLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3YzY5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5DYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5PcGVuRGlhZ3JhbUVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDMzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0KSB7DQorCQkJKChDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlDQorCQkJCQkuc2V0VGV4dCgiQ2FydGVzaWFuUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUNCisJCQkJCS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDI3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM5IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA0NzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCUNhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUoKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wSGVscGVyID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkNCisJCQkJLmdldCgxKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wUmVmID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkuZ2V0KDIpOw0KKwkJTGFiZWxzLnNldExhYmVscyhjb21wSGVscGVyLCBjb21wUmVmLCB0cnVlKTsNCisJCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0KSB7DQorCQkJKChDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlDQorCQkJCQkuc2V0VGV4dCgiQ2FydGVzaWFuUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUNCisJCQkJCS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjM1ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAwMzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZmUwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0DQorCQlleHRlbmRzIFNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDA3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5YzBjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMTE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE1MzAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAxNTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlN2ExZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0DQorCQlleHRlbmRzIFNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDIxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlZjAxZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMzk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3MDM3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAwMTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDMxYTEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMDQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWMwNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMDg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZjNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMTI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFmMzRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMTY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWUwMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMjI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDc3NWJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNDA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3YjA2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMDI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2VkYjllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDUxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ2FydGVzaWFuUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDAyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ2FydGVzaWFuUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQpIHsNCisJCQkoKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlpZiAoZXZlbnQuZ2V0Tm90aWZpZXIoKSA9PSBnZXRNb2RlbCgpDQorCQkJCSYmIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKQ0KKwkJCQkJCS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgew0KKwkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlDQorCQkJCQkuc2V0VGV4dCgiQ2FydGVzaWFuUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUNCisJCQkJCS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFiMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA3OTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM5NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA3NzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZlYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA3NTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTBkMWEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA3MzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTI0YjdhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAyODsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAzMywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkzZTIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAzMzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhMTU2MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDgwOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDIsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTBmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRpYWdyYW1EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Ecm9wT2JqZWN0c1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29tcmVsQ3JlYXRlU2hvcnRjdXREZWNvcmF0aW9uc0NvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcG9zaXRlUmVmYWN0b3JpbmdDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTU9ERUxfSUQgPSAiQ29tcmVsIjsgLy8kTk9OLU5MUy0xJA0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERpYWdyYW1EcmFnRHJvcEVkaXRQb2xpY3koKSB7DQorCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXREcm9wT2JqZWN0c0NvbW1hbmQoDQorCQkJCQkJCURyb3BPYmplY3RzUmVxdWVzdCBkcm9wUmVxdWVzdCkgew0KKwkJCQkJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oKTsNCisJCQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gZHJvcFJlcXVlc3QuZ2V0T2JqZWN0cygpDQorCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCQkJCQlPYmplY3QgbmV4dE9iamVjdCA9IGl0Lm5leHQoKTsNCisJCQkJCQkJaWYgKGZhbHNlID09IG5leHRPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7DQorCQkJCQkJCQljb250aW51ZTsNCisJCQkJCQkJfQ0KKwkJCQkJCQl2aWV3RGVzY3JpcHRvcnMNCisJCQkJCQkJCQkuYWRkKG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJKEVPYmplY3QpIG5leHRPYmplY3QpLA0KKwkJCQkJCQkJCQkJTm9kZS5jbGFzcywgbnVsbCwNCisJCQkJCQkJCQkJCWdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSkpOw0KKwkJCQkJCX0NCisJCQkJCQlyZXR1cm4gY3JlYXRlU2hvcnRjdXRzQ29tbWFuZChkcm9wUmVxdWVzdCwNCisJCQkJCQkJCXZpZXdEZXNjcmlwdG9ycyk7DQorCQkJCQl9DQorDQorCQkJCQlwcml2YXRlIENvbW1hbmQgY3JlYXRlU2hvcnRjdXRzQ29tbWFuZCgNCisJCQkJCQkJRHJvcE9iamVjdHNSZXF1ZXN0IGRyb3BSZXF1ZXN0LA0KKwkJCQkJCQlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMpIHsNCisJCQkJCQlDb21tYW5kIGNvbW1hbmQgPSBjcmVhdGVWaWV3c0FuZEFycmFuZ2VDb21tYW5kKA0KKwkJCQkJCQkJZHJvcFJlcXVlc3QsIHZpZXdEZXNjcmlwdG9ycyk7DQorCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgew0KKwkJCQkJCQlyZXR1cm4gY29tbWFuZA0KKwkJCQkJCQkJCS5jaGFpbihuZXcgSUNvbW1hbmRQcm94eSgNCisJCQkJCQkJCQkJCW5ldyBDb21yZWxDcmVhdGVTaG9ydGN1dERlY29yYXRpb25zQ29tbWFuZCgNCisJCQkJCQkJCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQkJCQkoVmlldykgZ2V0TW9kZWwoKSwNCisJCQkJCQkJCQkJCQkJdmlld0Rlc2NyaXB0b3JzKSkpOw0KKwkJCQkJCX0NCisJCQkJCQlyZXR1cm4gbnVsbDsNCisJCQkJCX0NCisJCQkJfSk7DQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5QT1BVUEJBUl9ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJLypwYWNrYWdlLWxvY2FsKi9zdGF0aWMgY2xhc3MgTm9kZUxhYmVsRHJhZ1BvbGljeSBleHRlbmRzDQorCQkJTm9uUmVzaXphYmxlRWRpdFBvbGljeSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7DQorCQkJTW92ZUhhbmRsZSBoID0gbmV3IE1vdmVIYW5kbGUoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOw0KKwkJCWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhNWJmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db21yZWxFZGl0UGFydEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwMDkgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsNCisJCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlWaWV3IHZpZXcgPSAoVmlldykgbW9kZWw7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKSB7DQorDQorCQkJY2FzZSBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQXRvbWljVW5pdEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBBdG9taWNVbml0TGFiZWxUeXBlRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aU91dHB1dFBvcnRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQXRvbWljVW5pdDJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIEF0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IEF0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBBdG9taWNVbml0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQXRvbWljVW5pdExhYmVsVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQXRvbWljVW5pdExhYmVsVHlwZTNFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IEF0b21pY1VuaXQ0RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBBdG9taWNVbml0TGFiZWxUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBBdG9taWNVbml0TGFiZWxUeXBlNEVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXROYW1lVHlwZTVFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IEF0b21pY1VuaXQ1RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBBdG9taWNVbml0TGFiZWxUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBBdG9taWNVbml0TGFiZWxUeXBlNUVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU3RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25DaGVja0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IEF0b21pY1VuaXQ2RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBBdG9taWNVbml0TGFiZWxUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBBdG9taWNVbml0TGFiZWxUeXBlNkVkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQXRvbWljVW5pdDdFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIEF0b21pY1VuaXRMYWJlbFR5cGU3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IEF0b21pY1VuaXRMYWJlbFR5cGU3RWRpdFBhcnQodmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzRWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQoDQorCQkJCQkJdmlldyk7DQorDQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlyZXR1cm4gbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdFZGl0UGFydCgNCisJCQkJCQl2aWV3KTsNCisNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCQkJCXZpZXcpOw0KKw0KKwkJCWNhc2UgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydCh2aWV3KTsNCisNCisJCQljYXNlIE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCXJldHVybiBuZXcgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0KHZpZXcpOw0KKw0KKwkJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJcmV0dXJuIG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQodmlldyk7DQorDQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFZGl0UGFydCBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsNCisJCS8vIEhhbmRsZSBjcmVhdGlvbiBvZiB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBFZGl0UGFydHMgaGVyZQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ2VsbEVkaXRvckxvY2F0b3IgZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKA0KKwkJCUlUZXh0QXdhcmVFZGl0UGFydCBzb3VyY2UpIHsNCisJCWlmIChzb3VyY2UuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKQ0KKwkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3JMb2NhdG9yKChXcmFwcGluZ0xhYmVsKSBzb3VyY2UuZ2V0RmlndXJlKCkpOw0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKChMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHByaXZhdGUgY2xhc3MgVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3Igew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCB3cmFwTGFiZWw7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFRleHRDZWxsRWRpdG9yTG9jYXRvcihXcmFwcGluZ0xhYmVsIHdyYXBMYWJlbCkgew0KKwkJCXRoaXMud3JhcExhYmVsID0gd3JhcExhYmVsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldFdyYXBMYWJlbCgpIHsNCisJCQlyZXR1cm4gd3JhcExhYmVsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgew0KKwkJCVRleHQgdGV4dCA9IChUZXh0KSBjZWxsZWRpdG9yLmdldENvbnRyb2woKTsNCisJCQlSZWN0YW5nbGUgcmVjdCA9IGdldFdyYXBMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7DQorCQkJZ2V0V3JhcExhYmVsKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsNCisJCQlpZiAoIXRleHQuZ2V0Rm9udCgpLmlzRGlzcG9zZWQoKSkgew0KKwkJCQlpZiAoZ2V0V3JhcExhYmVsKCkuaXNUZXh0V3JhcE9uKCkNCisJCQkJCQkmJiBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7DQorCQkJCQlyZWN0LnNldFNpemUobmV3IERpbWVuc2lvbih0ZXh0LmNvbXB1dGVTaXplKHJlY3Qud2lkdGgsDQorCQkJCQkJCVNXVC5ERUZBVUxUKSkpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJaW50IGF2ciA9IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyh0ZXh0LmdldEZvbnQoKSkNCisJCQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsNCisJCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsDQorCQkJCQkJCVNXVC5ERUZBVUxUKSkuZXhwYW5kKGF2ciAqIDIsIDApKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7DQorCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3Igew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgTGFiZWwgbGFiZWw7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpIHsNCisJCQl0aGlzLmxhYmVsID0gbGFiZWw7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIExhYmVsIGdldExhYmVsKCkgew0KKwkJCXJldHVybiBsYWJlbDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsNCisJCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7DQorCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7DQorCQkJZ2V0TGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOw0KKwkJCWlmICghdGV4dC5nZXRGb250KCkuaXNEaXNwb3NlZCgpKSB7DQorCQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpDQorCQkJCQkJLmdldEF2ZXJhZ2VDaGFyV2lkdGgoKTsNCisJCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwNCisJCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7DQorCQkJfQ0KKwkJCWlmICghcmVjdC5lcXVhbHMobmV3IFJlY3RhbmdsZSh0ZXh0LmdldEJvdW5kcygpKSkpIHsNCisJCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisJCQl9DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbkNoZWNrRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25DaGVja0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0ZWVlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25DaGVja0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwyOTggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbkNoZWNrSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uQ2hlY2tFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNzY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25DaGVja0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbkNoZWNrSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBDb25kaXRpb25DaGVja0ZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uQ2hlY2tGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDb25kaXRpb25DaGVja0ZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydCkgew0KKwkJCSgoQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ29uZGl0aW9uQ2hlY2tMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbkNoZWNrTmFtZVR5cGVTcGVjRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrRmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVDb25kaXRpb25DaGVja0xhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25DaGVja0ZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZUNvbmRpdGlvbkNoZWNrTGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25DaGVja0xhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbkNoZWNrIik7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbkNoZWNrTGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNvbmRpdGlvbkNoZWNrTGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25DaGVja0xhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25DaGVja05hbWVUeXBlU3BlY0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWUyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNTI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3NiwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25DaGVja05hbWVUeXBlU3BlY0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiODE4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQ5MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDMwOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKENvbmRpdGlvbmFsVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQpIHsNCisJCQkoKENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9ORSk7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT05FKTsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDlFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKS5nZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbmFsVW5pdCIpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWQwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA0NjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgQ29uZGl0aW9uYWxVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDb25kaXRpb25hbFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KSB7DQorCQkJKChDb25kaXRpb25hbFVuaXROYW1lVHlwZTNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9ORSk7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT05FKTsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbmFsVW5pdCIpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOGY2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA2NjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0NENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgQ29uZGl0aW9uYWxVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDb25kaXRpb25hbFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KSB7DQorCQkJKChDb25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9ORSk7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT05FKTsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbmFsVW5pdCIpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNGJiODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA3MTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgQ29uZGl0aW9uYWxVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDb25kaXRpb25hbFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KSB7DQorCQkJKChDb25kaXRpb25hbFVuaXROYW1lVHlwZTVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9ORSk7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT05FKTsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU1RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbmFsVW5pdCIpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTg1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA3MjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgQ29uZGl0aW9uYWxVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDb25kaXRpb25hbFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNkVkaXRQYXJ0KSB7DQorCQkJKChDb25kaXRpb25hbFVuaXROYW1lVHlwZTZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9ORSk7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT05FKTsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbmFsVW5pdCIpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmRmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA3NTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgQ29uZGl0aW9uYWxVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChDb25kaXRpb25hbFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlN0VkaXRQYXJ0KSB7DQorCQkJKChDb25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9ORSk7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT05FKTsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbmFsVW5pdCIpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDgxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDM4Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiYzc0MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzRWRpdFBhcnQgZXh0ZW5kcw0KKwkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNTQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWEzNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydCBleHRlbmRzDQorCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA2NDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTQzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDY4Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0M2ExZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQgZXh0ZW5kcw0KKwkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNzQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNiY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydCBleHRlbmRzDQorCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA4NDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWY4ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDIwOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGJlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAzNjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjY1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA1MjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZGU4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA2MjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjYwODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA2NjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNmM1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA3MjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTBiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA4MjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjNjYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAxODsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiOTc4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDM1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjY2M3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDUxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5MmNiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDYxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ZWQyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDY1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkM2Y2YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDcxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlYzk0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDgxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Y2UyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDE3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmMmVhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQgZXh0ZW5kcw0KKwkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMzc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzAzMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydCBleHRlbmRzDQorCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA1MzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjFiM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDYzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhY2Q0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnQgZXh0ZW5kcw0KKwkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNjc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYxMmNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydCBleHRlbmRzDQorCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA3MzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDMwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0VkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDgzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWIxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQgZXh0ZW5kcw0KKwkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMTk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM0M2YwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1MDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29uZGl0aW9uYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db25kaXRpb25hbFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDA2Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBDb25kaXRpb25hbFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgQ29uZGl0aW9uYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKENvbmRpdGlvbmFsVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVFZGl0UGFydCkgew0KKwkJCSgoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9ORSk7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT05FKTsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpLmdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJaWYgKGV2ZW50LmdldE5vdGlmaWVyKCkgPT0gZ2V0TW9kZWwoKQ0KKwkJCQkmJiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCkNCisJCQkJCQkuZXF1YWxzKGV2ZW50LmdldEZlYXR1cmUoKSkpIHsNCisJCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBDb25kaXRpb25hbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIkNvbmRpdGlvbmFsVW5pdCIpOw0KKwkJCWZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjdmMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXROYW1lVHlwZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNzI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDMwLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZTNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGZhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlM0VkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA2NTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXROYW1lVHlwZTNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhMmIzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU0RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDYwOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWNjYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXROYW1lVHlwZTVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNTc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcxLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZTZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODMzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNkVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA1NjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXROYW1lVHlwZTZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdE5hbWVUeXBlN0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhZTYxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU3RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDU1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlN0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL0NvbmRpdGlvbmFsVW5pdE5hbWVUeXBlRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllN2UzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9Db25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA4NDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMjAwNiwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDc3NTk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM2NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGZWF0dXJlVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk11bHRpRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMzk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgTXVsdGlGZWF0dXJlVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgTXVsdGlGZWF0dXJlVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUZlYXR1cmVVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KSB7DQorCQkJKChNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJNdWx0aUZlYXR1cmVVbml0Iik7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MGFmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzY2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5NdWx0aUZlYXR1cmVVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGZWF0dXJlVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA1MTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUZlYXR1cmVVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBNdWx0aUZlYXR1cmVVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpRmVhdHVyZVVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQpIHsNCisJCQkoKE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aU91dHB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUZlYXR1cmVVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoIk11bHRpRmVhdHVyZVVuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmOGZkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk11bHRpRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5NdWx0aUZlYXR1cmVVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDU2Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IE11bHRpRmVhdHVyZVVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IE11bHRpRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBNdWx0aUZlYXR1cmVVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydCkgew0KKwkJCSgoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aU91dHB1dFBvcnRFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aU91dHB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aU91dHB1dFBvcnRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiTXVsdGlGZWF0dXJlVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk5MWMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM2NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGZWF0dXJlVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk11bHRpRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNjI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgTXVsdGlGZWF0dXJlVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgTXVsdGlGZWF0dXJlVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUZlYXR1cmVVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KSB7DQorCQkJKChNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJNdWx0aUZlYXR1cmVVbml0Iik7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdhOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzY2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5NdWx0aUZlYXR1cmVVbml0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5NdWx0aUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAxMjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IE11bHRpRmVhdHVyZVVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgTXVsdGlGZWF0dXJlVW5pdENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpRmVhdHVyZVVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydCkgew0KKwkJCSgoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aU91dHB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiTXVsdGlGZWF0dXJlVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2YjRkOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMzA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMzksDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzMWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTNFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMzc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTEsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyM2VmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNDE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkNDYyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNDU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNjIsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MWEyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAxMzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxNTNlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNDE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUZpbHRlclVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IE11bHRpRmlsdGVyVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgTXVsdGlGaWx0ZXJVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUZpbHRlclVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydCkgew0KKwkJCSgoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoIk11bHRpRmlsdGVyVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkMjQzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNTM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUZpbHRlclVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IE11bHRpRmlsdGVyVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgTXVsdGlGaWx0ZXJVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUZpbHRlclVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydCkgew0KKwkJCSgoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoIk11bHRpRmlsdGVyVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwMDAyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNTg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUZpbHRlclVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IE11bHRpRmlsdGVyVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgTXVsdGlGaWx0ZXJVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUZpbHRlclVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydCkgew0KKwkJCSgoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoIk11bHRpRmlsdGVyVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxNDI4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNjQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUZpbHRlclVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IE11bHRpRmlsdGVyVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgTXVsdGlGaWx0ZXJVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUZpbHRlclVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydCkgew0KKwkJCSgoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT3QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoIk11bHRpRmlsdGVyVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmJhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlGaWx0ZXJVbml0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5NdWx0aUZpbHRlclVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMTk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IE11bHRpRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBNdWx0aUZpbHRlclVuaXRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgTXVsdGlGaWx0ZXJVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUZpbHRlclVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0KSB7DQorCQkJKChNdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIE11bHRpRmlsdGVyVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiTXVsdGlGaWx0ZXJVbml0Iik7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkMzBlNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDMyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA0MSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2EyMWMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMzk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTNjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA0MzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTgsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3N2E5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDQ3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA2NCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmOWMyZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAxOTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGY2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDJFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDJFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMjY2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQzSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMTA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjE3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDRFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMTQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTdjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMTc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDk1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMjA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Zjg3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDdFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMjQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDdFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDhFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzc3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQ4SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMjg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDhFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydDlFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmU5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnQ5SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5JbnB1dFBvcnRGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDlFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMzI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDlFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydDlJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKTsNCisJCUlucHV0UG9ydCBwb3J0ID0gKElucHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKE11bHRpSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBJbnB1dFBvcnRGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgxMCk7DQorCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFKTsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGZpbmFsIENvbG9yIFRISVNfRk9SRSA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ1MmQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuTXVsdGlJbnB1dFBvcnRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlJbnB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQgZXh0ZW5kcyBCb3JkZXJlZEJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDAyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBNdWx0aUlucHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCkgew0KKw0KKwkJCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7DQorCQkJCQkJCU1vdmVIYW5kbGUgbWggPSBuZXcgTW92ZUhhbmRsZSgNCisJCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSk7DQorCQkJCQkJCW1oLnNldEJvcmRlcihudWxsKTsNCisJCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobWgpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJTXVsdGlJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IE11bHRpSW5wdXRQb3J0RmlndXJlKCk7DQorCQlJbnB1dFBvcnQgcG9ydCA9IChJbnB1dFBvcnQpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJZmlndXJlLnNldFBvcnQocG9ydCk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZSgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpOw0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCgNCisJCQlJR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQpIHsNCisJCUxpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4oKTsNCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDEpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BVHlwZXNGb3JTb3VyY2UoSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsNCisJCUxpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4oKTsNCisJCWlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDIwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDIxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIE11bHRpSW5wdXRQb3J0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0TGluZVdpZHRoKDEwKTsNCisJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihUSElTX0ZPUkUpOw0KKwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJfQ0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgZmluYWwgQ29sb3IgVEhJU19GT1JFID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCk7DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzkzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7DQorCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOw0KKwkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgew0KKwkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KA0KKwkJCQkJZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7DQorCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsNCisJCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsNCisJCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkNCisJCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpbnQgcG9zRG90ID0gLTE7DQorCQlpbnQgcG9zRG91YmxlID0gLTE7DQorCQlwb3NEb3QgPSB0ZXh0Lmxhc3RJbmRleE9mKCIuIik7DQorCQlwb3NEb3VibGUgPSB0ZXh0LmluZGV4T2YoIjoiKTsNCisJCWlmIChwb3NEb3QgPiAtMSAmJiBwb3NEb3VibGUgPiAtMSkgew0KKwkJCVN0cmluZyBmaXJzdCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc0RvdWJsZSArIDEpOw0KKwkJCVN0cmluZyBzZWNvbmQgPSB0ZXh0LnN1YnN0cmluZyhwb3NEb3QgKyAxKTsNCisJCQl0ZXh0ID0gZmlyc3QgKyBzZWNvbmQ7DQorCQl9DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsNCisJCXJldHVybiBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsNCisJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0VGV4dCgiTXVsdGlJbnB1dFBvcnQiKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWYxOWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDA3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIk11bHRpSW5wdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllMzRkYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzDQorCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAxMTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyB7DQorCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJbmV3IFBvaW50KDAsIDApKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsNCisJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7DQorCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7DQorCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoDQorCQkJCQlnZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsNCisJCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7DQorCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7DQorCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOw0KKwkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQ0KKwkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWludCBwb3NEb3QgPSAtMTsNCisJCWludCBwb3NEb3VibGUgPSAtMTsNCisJCXBvc0RvdCA9IHRleHQubGFzdEluZGV4T2YoIi4iKTsNCisJCXBvc0RvdWJsZSA9IHRleHQuaW5kZXhPZigiOiIpOw0KKwkJaWYgKHBvc0RvdCA+IC0xICYmIHBvc0RvdWJsZSA+IC0xKSB7DQorCQkJU3RyaW5nIGZpcnN0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zRG91YmxlICsgMSk7DQorCQkJU3RyaW5nIHNlY29uZCA9IHRleHQuc3Vic3RyaW5nKHBvc0RvdCArIDEpOw0KKwkJCXRleHQgPSBmaXJzdCArIHNlY29uZDsNCisJCX0NCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgV3JhcHBpbmdMYWJlbCB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJNdWx0aUlucHV0UG9ydCIpOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxY2VmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMTQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7DQorCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOw0KKwkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgew0KKwkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KA0KKwkJCQkJZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7DQorCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsNCisJCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsNCisJCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkNCisJCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpbnQgcG9zRG90ID0gLTE7DQorCQlpbnQgcG9zRG91YmxlID0gLTE7DQorCQlwb3NEb3QgPSB0ZXh0Lmxhc3RJbmRleE9mKCIuIik7DQorCQlwb3NEb3VibGUgPSB0ZXh0LmluZGV4T2YoIjoiKTsNCisJCWlmIChwb3NEb3QgPiAtMSAmJiBwb3NEb3VibGUgPiAtMSkgew0KKwkJCVN0cmluZyBmaXJzdCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc0RvdWJsZSArIDEpOw0KKwkJCVN0cmluZyBzZWNvbmQgPSB0ZXh0LnN1YnN0cmluZyhwb3NEb3QgKyAxKTsNCisJCQl0ZXh0ID0gZmlyc3QgKyBzZWNvbmQ7DQorCQl9DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsNCisJCXJldHVybiBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsNCisJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0VGV4dCgiTXVsdGlJbnB1dFBvcnQiKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU2ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDE3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIk11bHRpSW5wdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhOGU1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzDQorCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAyMTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyB7DQorCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJbmV3IFBvaW50KDAsIDApKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsNCisJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7DQorCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7DQorCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoDQorCQkJCQlnZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsNCisJCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7DQorCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7DQorCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOw0KKwkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQ0KKwkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWludCBwb3NEb3QgPSAtMTsNCisJCWludCBwb3NEb3VibGUgPSAtMTsNCisJCXBvc0RvdCA9IHRleHQubGFzdEluZGV4T2YoIi4iKTsNCisJCXBvc0RvdWJsZSA9IHRleHQuaW5kZXhPZigiOiIpOw0KKwkJaWYgKHBvc0RvdCA+IC0xICYmIHBvc0RvdWJsZSA+IC0xKSB7DQorCQkJU3RyaW5nIGZpcnN0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zRG91YmxlICsgMSk7DQorCQkJU3RyaW5nIHNlY29uZCA9IHRleHQuc3Vic3RyaW5nKHBvc0RvdCArIDEpOw0KKwkJCXRleHQgPSBmaXJzdCArIHNlY29uZDsNCisJCX0NCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgV3JhcHBpbmdMYWJlbCB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJNdWx0aUlucHV0UG9ydCIpOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDgxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMjM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7DQorCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOw0KKwkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgew0KKwkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KA0KKwkJCQkJZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7DQorCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsNCisJCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsNCisJCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkNCisJCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpbnQgcG9zRG90ID0gLTE7DQorCQlpbnQgcG9zRG91YmxlID0gLTE7DQorCQlwb3NEb3QgPSB0ZXh0Lmxhc3RJbmRleE9mKCIuIik7DQorCQlwb3NEb3VibGUgPSB0ZXh0LmluZGV4T2YoIjoiKTsNCisJCWlmIChwb3NEb3QgPiAtMSAmJiBwb3NEb3VibGUgPiAtMSkgew0KKwkJCVN0cmluZyBmaXJzdCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc0RvdWJsZSArIDEpOw0KKwkJCVN0cmluZyBzZWNvbmQgPSB0ZXh0LnN1YnN0cmluZyhwb3NEb3QgKyAxKTsNCisJCQl0ZXh0ID0gZmlyc3QgKyBzZWNvbmQ7DQorCQl9DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsNCisJCXJldHVybiBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsNCisJCXJldHVybiBuZXcgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0VGV4dCgiTXVsdGlJbnB1dFBvcnQiKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzVlNmQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDI1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMiwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIk11bHRpSW5wdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjhhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDAzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsNCisJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7DQorCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7DQorCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoDQorCQkJCQlnZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsNCisJCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7DQorCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7DQorCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOw0KKwkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQ0KKwkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWludCBwb3NEb3QgPSAtMTsNCisJCWludCBwb3NEb3VibGUgPSAtMTsNCisJCXBvc0RvdCA9IHRleHQubGFzdEluZGV4T2YoIi4iKTsNCisJCXBvc0RvdWJsZSA9IHRleHQuaW5kZXhPZigiOiIpOw0KKwkJaWYgKHBvc0RvdCA+IC0xICYmIHBvc0RvdWJsZSA+IC0xKSB7DQorCQkJU3RyaW5nIGZpcnN0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zRG91YmxlICsgMSk7DQorCQkJU3RyaW5nIHNlY29uZCA9IHRleHQuc3Vic3RyaW5nKHBvc0RvdCArIDEpOw0KKwkJCXRleHQgPSBmaXJzdCArIHNlY29uZDsNCisJCX0NCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIk11bHRpSW5wdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMmU2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Cb3JkZXJlZEJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLk91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuTXVsdGlPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmZpZ3VyZXMuT3V0cHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMjE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgTXVsdGlPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlNdWx0aU91dHB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IE11bHRpT3V0cHV0UG9ydEZpZ3VyZSgpOw0KKwkJT3V0cHV0UG9ydCBwb3J0ID0gKE91dHB1dFBvcnQpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJZmlndXJlLnNldFBvcnQocG9ydCk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoTXVsdGlPdXRwdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsNCisJCQlsb2NhdG9yLnNldEJvcmRlckl0ZW1PZmZzZXQobmV3IERpbWVuc2lvbigtMjAsIC0yMCkpOw0KKwkJCWJvcmRlckl0ZW1Db250YWluZXIuYWRkKGJvcmRlckl0ZW1FZGl0UGFydC5nZXRGaWd1cmUoKSwgbG9jYXRvcik7DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZEJvcmRlckl0ZW0oYm9yZGVySXRlbUNvbnRhaW5lciwgYm9yZGVySXRlbUVkaXRQYXJ0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoMjAsIDIwKTsNCisNCisJCS8vRklYTUU6IHdvcmthcm91bmQgZm9yICMxNTQ1MzYNCisJCXJlc3VsdC5nZXRCb3VuZHMoKS5zZXRTaXplKHJlc3VsdC5nZXRQcmVmZXJyZWRTaXplKCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZSgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpOw0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCgNCisJCQlJR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQpIHsNCisJCUxpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4oKTsNCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aU91dHB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBPdXRwdXRQb3J0RmlndXJlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0TGluZVdpZHRoKDEwKTsNCisJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihUSElTX0ZPUkUpOw0KKwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJfQ0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgZmluYWwgQ29sb3IgVEhJU19GT1JFID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCk7DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aU91dHB1dFBvcnRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NDJkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aU91dHB1dFBvcnRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5PdXRwdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk11bHRpT3V0cHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmZpZ3VyZXMuT3V0cHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0IGV4dGVuZHMgQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAxNTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQlnZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IE11bHRpT3V0cHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpIHsNCisNCisJCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgew0KKwkJCQkJCQlNb3ZlSGFuZGxlIG1oID0gbmV3IE1vdmVIYW5kbGUoDQorCQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOw0KKwkJCQkJCQltaC5zZXRCb3JkZXIobnVsbCk7DQorCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1oKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCU11bHRpT3V0cHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgTXVsdGlPdXRwdXRQb3J0RmlndXJlKCk7DQorCQlPdXRwdXRQb3J0IHBvcnQgPSAoT3V0cHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aU91dHB1dFBvcnRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aU91dHB1dFBvcnRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQm9yZGVySXRlbShJRmlndXJlIGJvcmRlckl0ZW1Db250YWluZXIsDQorCQkJSUJvcmRlckl0ZW1FZGl0UGFydCBib3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCWlmIChib3JkZXJJdGVtRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aU91dHB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aU91dHB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZSgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpOw0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCgNCisJCQlJR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQpIHsNCisJCUxpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4oKTsNCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMik7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aU91dHB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBPdXRwdXRQb3J0RmlndXJlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0TGluZVdpZHRoKDEwKTsNCisJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihUSElTX0ZPUkUpOw0KKwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJfQ0KKw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgZmluYWwgQ29sb3IgVEhJU19GT1JFID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCk7DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmNjdjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDE4Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJbmV3IFBvaW50KDAsIDApKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7DQorCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOw0KKwkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgew0KKwkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KA0KKwkJCQkJZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7DQorCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsNCisJCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsNCisJCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkNCisJCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpbnQgcG9zRG90ID0gLTE7DQorCQlpbnQgcG9zRG91YmxlID0gLTE7DQorCQlwb3NEb3QgPSB0ZXh0Lmxhc3RJbmRleE9mKCIuIik7DQorCQlwb3NEb3VibGUgPSB0ZXh0LmluZGV4T2YoIjoiKTsNCisJCWlmIChwb3NEb3QgPiAtMSAmJiBwb3NEb3VibGUgPiAtMSkgew0KKwkJCVN0cmluZyBmaXJzdCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc0RvdWJsZSArIDEpOw0KKwkJCVN0cmluZyBzZWNvbmQgPSB0ZXh0LnN1YnN0cmluZyhwb3NEb3QgKyAxKTsNCisJCQl0ZXh0ID0gZmlyc3QgKyBzZWNvbmQ7DQorCQl9DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBNdWx0aU91dHB1dFBvcnRMYWJlbEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJNdWx0aU91dHB1dFBvcnQiKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDUzMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL011bHRpT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDEyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBNdWx0aU91dHB1dFBvcnRMYWJlbEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJNdWx0aU91dHB1dFBvcnQiKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2OGE4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdGF0YWJsZURlY29yYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUcmVlQnJhbmNoRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Qb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5NdWx0aVBvcnRNYXBwaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmZpZ3VyZXMuUG9ydE1hcHBpbmdGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUcmVlQnJhbmNoRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgTXVsdGlQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisNCisJcHJvdGVjdGVkIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpIHsNCisJCVBvcnRNYXBwaW5nIG1hcHBpbmcgPSAoUG9ydE1hcHBpbmcpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJUG9ydE1hcHBpbmdGaWd1cmUgZmlndXJlID0gbmV3IE11bHRpUG9ydE1hcHBpbmdGaWd1cmUoKTsNCisJCWZpZ3VyZS5zZXRNYXBwaW5nKG1hcHBpbmcpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpUG9ydE1hcHBpbmdGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aVBvcnRNYXBwaW5nRmlndXJlKSBnZXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aVBvcnRNYXBwaW5nRmlndXJlIGV4dGVuZHMgUG9ydE1hcHBpbmdGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aVBvcnRNYXBwaW5nRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0TGluZVdpZHRoKDIpOw0KKwkJCXRoaXMuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfRE9UKTsNCisNCisJCQlzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSb3RhdGFibGVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7DQorCQkJUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IFBvbHlsaW5lRGVjb3JhdGlvbigpOw0KKwkJCXJldHVybiBkZjsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3ODRhMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdGF0YWJsZURlY29yYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUcmVlQnJhbmNoRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Qb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmZpZ3VyZXMuUG9ydE1hcHBpbmdGaWd1cmU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0aW9uTm9kZUVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUcmVlQnJhbmNoRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisNCisJcHJvdGVjdGVkIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpIHsNCisJCVBvcnRNYXBwaW5nIG1hcHBpbmcgPSAoUG9ydE1hcHBpbmcpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJUG9ydE1hcHBpbmdGaWd1cmUgZmlndXJlID0gbmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmUoKTsNCisJCWZpZ3VyZS5zZXRNYXBwaW5nKG1hcHBpbmcpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRmlndXJlKSBnZXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBjbGFzcyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRmlndXJlIGV4dGVuZHMgUG9ydE1hcHBpbmdGaWd1cmUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0TGluZVdpZHRoKDIpOw0KKwkJCXRoaXMuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfRE9UKTsNCisNCisJCQlzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSb3RhdGFibGVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7DQorCQkJUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IFBvbHlsaW5lRGVjb3JhdGlvbigpOw0KKwkJCXJldHVybiBkZjsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3ZTg1NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQzOCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAwNDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJLy8JCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkvLwkJdW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCkgew0KKwkJCSgoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlBhcmFsbGVsUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlDQorCQkJCQkuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc4NTU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDM2Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0KSB7DQorCQkJKChQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlBhcmFsbGVsUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlDQorCQkJCQkuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGY4NzBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDM3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0KSB7DQorCQkJKChQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlBhcmFsbGVsUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlDQorCQkJCQkuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzgwMGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDQzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0KSB7DQorCQkJKChQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlBhcmFsbGVsUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlDQorCQkJCQkuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDMzMGEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM5IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDQ1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0KSB7DQorCQkJKChQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlBhcmFsbGVsUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlDQorCQkJCQkuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQzYWRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA0ODsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCXVuaXQuc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQpIHsNCisJCQkoKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiUGFyYWxsZWxRdWV1ZWRVbml0Iik7DQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUNCisJCQkJCS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNkNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0NTMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJLy8JCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkvLwkJdW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KSB7DQorCQkJKChQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCWlmIChldmVudC5nZXROb3RpZmllcigpID09IGdldE1vZGVsKCkNCisJCQkJJiYgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpDQorCQkJCQkJLmVxdWFscyhldmVudC5nZXRGZWF0dXJlKCkpKSB7DQorCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiUGFyYWxsZWxRdWV1ZWRVbml0Iik7DQorCQkJZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUNCisJCQkJCS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTcyNDdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCBleHRlbmRzDQorCQlDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNzg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDA0LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTY1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA3MTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5N2IwZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDcwOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTYyNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCBleHRlbmRzDQorCQlDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNjg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQzLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGRmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA2NjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmZTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDM1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZDIzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA4MTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMjAwMywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZlZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMjM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQzOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMjU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdjODNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMjk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRhM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMzM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTA0Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNDE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTBjMzlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNzU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxY2FlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMDU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRjNjcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAyNDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Mzk0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0DQorCQlleHRlbmRzIFNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDI2Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1ODVlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwMzA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGMwYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAzNDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2E5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0DQorCQlleHRlbmRzIFNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDQyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkZGY3MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNzY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5NTdjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAwNjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTU1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQzOSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXRFZGl0UGFydC5TZXF1ZW50aWFsVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAyNjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTZXF1ZW50aWFsVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgU2VxdWVudGlhbFVuaXRGaWd1cmUoKTsNCisJCS8vCQlSZWZhY3RvcmluZ1VuaXQgdW5pdCA9IChSZWZhY3RvcmluZ1VuaXQpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJLy8JCXVuaXQuc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgZmFsc2UpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJCS8vCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IFNlcXVlbnRpYWxVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNlcXVlbnRpYWxVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCkgew0KKwkJCSgoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlNlcXVlbnRpYWxVbml0Iik7DQorCQkJZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjQ1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQzOSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuU2VxdWVudGlhbFVuaXRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuY3VzdG9tLkxhYmVsczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5PcGVuRGlhZ3JhbUVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNDQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsDQorCQkJCW5ldyBPcGVuRGlhZ3JhbUVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJU2VxdWVudGlhbFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IFNlcXVlbnRpYWxVbml0RmlndXJlKCk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIGZhbHNlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCQkvLwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTZXF1ZW50aWFsVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQpIHsNCisJCQkoKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2VxdWVudGlhbFVuaXQiKTsNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjNDc4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM5IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5TZXF1ZW50aWFsVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA2MDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0NENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTZXF1ZW50aWFsVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgU2VxdWVudGlhbFVuaXRGaWd1cmUoKTsNCisJCS8vCQlSZWZhY3RvcmluZ1VuaXQgdW5pdCA9IChSZWZhY3RvcmluZ1VuaXQpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJLy8JCXVuaXQuc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgZmFsc2UpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJCS8vCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IFNlcXVlbnRpYWxVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNlcXVlbnRpYWxVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCkgew0KKwkJCSgoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJTZXF1ZW50aWFsVW5pdCIpOw0KKwkJCWZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQkJZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGNlOTgyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0MzkgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuUmVmYWN0b3JpbmdVbml0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlNlcXVlbnRpYWxVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDY5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVNlcXVlbnRpYWxVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpOw0KKwkJLy8JCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkvLwkJdW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wSGVscGVyID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkNCisJCQkJLmdldCgxKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wUmVmID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkuZ2V0KDIpOw0KKwkJTGFiZWxzLnNldExhYmVscyhjb21wSGVscGVyLCBjb21wUmVmLCBmYWxzZSk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwkJLy8JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2VxdWVudGlhbFVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2VxdWVudGlhbFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0KSB7DQorCQkJKChTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlNlcXVlbnRpYWxVbml0Iik7DQorCQkJZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTdiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQzOSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuU2VxdWVudGlhbFVuaXRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuY3VzdG9tLkxhYmVsczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5PcGVuRGlhZ3JhbUVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNzA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsDQorCQkJCW5ldyBPcGVuRGlhZ3JhbUVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJU2VxdWVudGlhbFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IFNlcXVlbnRpYWxVbml0RmlndXJlKCk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIGZhbHNlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCQkvLwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTZXF1ZW50aWFsVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQpIHsNCisJCQkoKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2VxdWVudGlhbFVuaXQiKTsNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNDZmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA3MzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTZXF1ZW50aWFsVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgU2VxdWVudGlhbFVuaXRGaWd1cmUoKTsNCisJCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIGZhbHNlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCQkvLwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTZXF1ZW50aWFsVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQpIHsNCisJCQkoKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2VxdWVudGlhbFVuaXQiKTsNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjA3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDUzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuUmVmYWN0b3JpbmdVbml0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDA1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVNlcXVlbnRpYWxVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpOw0KKwkJLy8JCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkvLwkJdW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wSGVscGVyID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkNCisJCQkJLmdldCgxKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wUmVmID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkuZ2V0KDIpOw0KKwkJTGFiZWxzLnNldExhYmVscyhjb21wSGVscGVyLCBjb21wUmVmLCBmYWxzZSk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwkJLy8JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2VxdWVudGlhbFVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2VxdWVudGlhbFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQpIHsNCisJCQkoKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCWlmIChldmVudC5nZXROb3RpZmllcigpID09IGdldE1vZGVsKCkNCisJCQkJJiYgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpDQorCQkJCQkJLmVxdWFscyhldmVudC5nZXRGZWF0dXJlKCkpKSB7DQorCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJTZXF1ZW50aWFsVW5pdCIpOw0KKwkJCWZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQkJZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkZWYwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA3NDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDI2LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWJmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydCBleHRlbmRzDQorCQlDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNjc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA0NCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIxZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDYyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjAsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1YjY1OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0IGV4dGVuZHMNCisJCUNvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTA1OTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDY5LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmIyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydCBleHRlbmRzDQorCQlDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNTg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJhN2QyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDUxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzMsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDMwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDgzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMjAwNSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1NzQ4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCBleHRlbmRzDQorCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAzMTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTg1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQgZXh0ZW5kcw0KKwkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNDc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTBiNjZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDU3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0ZGRhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCBleHRlbmRzDQorCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA1OTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTgyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQgZXh0ZW5kcw0KKwkJU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNjk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA4ZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0IGV4dGVuZHMNCisJCVNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDc5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTBiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCBleHRlbmRzDQorCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAxMzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjgxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAzMjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDdhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA0ODsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjljZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA1ODsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjY0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA2MDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODExNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA3MDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTUwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA4MDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjEyMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAxNDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc0Nzg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUZlYXR1cmVVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDM4Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGZWF0dXJlVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlRmVhdHVyZVVuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTE0ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUZlYXR1cmVVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmVhdHVyZVVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDUwOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGZWF0dXJlVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlRmVhdHVyZVVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlRmVhdHVyZVVuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkzMmJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUZlYXR1cmVVbml0NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmVhdHVyZVVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDU1Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGZWF0dXJlVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlRmVhdHVyZVVuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDg2ODFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUZlYXR1cmVVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDYxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGZWF0dXJlVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlRmVhdHVyZVVuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4MjczZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNjYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUZlYXR1cmVVbml0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVGZWF0dXJlVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDA4Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZUZlYXR1cmVVbml0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQpIHsNCisJCQkoKFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJTaW5nbGVGZWF0dXJlVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU1Zjg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDI5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzgsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkMjRlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAzNjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjhjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNTc2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNDA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZmN2VjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU1RWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDQ0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTM0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDA5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjNkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzUwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA0MDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGaWx0ZXJVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUZpbHRlclVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQpIHsNCisJCQkoKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlRmlsdGVyVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVhYWEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmlsdGVyVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUZpbHRlclVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNTI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlRmlsdGVyVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlRmlsdGVyVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IFNpbmdsZUZpbHRlclVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVGaWx0ZXJVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlNpbmdsZUZpbHRlclVuaXQiKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0YjM5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVGaWx0ZXJVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDU3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZUZpbHRlclVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IG5ldyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydCkgew0KKwkJCSgoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk90DQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJTaW5nbGVGaWx0ZXJVbml0Iik7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNGE0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzUwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmlsdGVyVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA2MzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGaWx0ZXJVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBuZXcgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUZpbHRlclVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQpIHsNCisJCQkoKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlRmlsdGVyVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmNWMxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM1MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmlsdGVyVW5pdENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMTY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVGaWx0ZXJVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZUZpbHRlclVuaXRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gbmV3IFNpbmdsZUZpbHRlclVuaXRGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVGaWx0ZXJVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQpIHsNCisJCQkoKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlRmlsdGVyVW5pdCIpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2N2EzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMzE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNDAsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyMTI1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMzg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTIsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0NDgwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNDI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlMWYzYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQNCisJCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwNDY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5Ob2RlTGFiZWxEcmFnUG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBwaW5nTGFiZWwgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDhmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDU3NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydA0KKwkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAxNjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgew0KKwkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOw0KKwkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kDQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4OGNjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5MWU2YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MmRkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzY2NkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMTM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhZGU0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMjM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZTU5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMjc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2NTNhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMzE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0OEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4NzhlNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuU2luZ2xlSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZUlucHV0UG9ydDlJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMzU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCWdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlSW5wdXRQb3J0OUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpOw0KKwkJSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZUlucHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7DQorCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsNCisJCQlib3JkZXJJdGVtQ29udGFpbmVyLmFkZChib3JkZXJJdGVtRWRpdFBhcnQuZ2V0RmlndXJlKCksIGxvY2F0b3IpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDIwLCAyMCk7DQorDQorCQkvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciAjMTU0NTM2DQorCQlyZXN1bHQuZ2V0Qm91bmRzKCkuc2V0U2l6ZShyZXN1bHQuZ2V0UHJlZmVycmVkU2l6ZSgpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2UoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KA0KKwkJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblRhcmdldCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yU291cmNlKElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQl9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGY4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLklucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVJbnB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZUlucHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpIHsNCisNCisJCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgew0KKwkJCQkJCQlNb3ZlSGFuZGxlIG1oID0gbmV3IE1vdmVIYW5kbGUoDQorCQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOw0KKwkJCQkJCQltaC5zZXRCb3JkZXIobnVsbCk7DQorCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1oKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVNpbmdsZUlucHV0UG9ydEZpZ3VyZSBmaWd1cmUgPSBuZXcgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCk7DQorCQlJbnB1dFBvcnQgcG9ydCA9IChJbnB1dFBvcnQpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJZmlndXJlLnNldFBvcnQocG9ydCk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlSW5wdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFSZWxUeXBlc09uU291cmNlKCkgew0KKwkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCgNCisJCQlJR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQpIHsNCisJCUxpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4oKTsNCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclRhcmdldChJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25UYXJnZXQoKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyk7DQorCQlyZXR1cm4gdHlwZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0PElFbGVtZW50VHlwZT4gZ2V0TUFUeXBlc0ZvclNvdXJjZShJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IExpbmtlZExpc3Q8SUVsZW1lbnRUeXBlPigpOw0KKwkJaWYgKHJlbGF0aW9uc2hpcFR5cGUgPT0gQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAxMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfSBlbHNlIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDIwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDIxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlpZiAoZXZlbnQuZ2V0Tm90aWZpZXIoKSA9PSBnZXRNb2RlbCgpDQorCQkJCSYmIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKQ0KKwkJCQkJCS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgew0KKwkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwkJfQ0KKwl9DQorDQorCS8vCS8qKg0KKwkvLwkgKiBAZ2VuZXJhdGVkDQorCS8vCSAqLw0KKwkvLwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsNCisJLy8NCisJLy8JCS8qKg0KKwkvLwkJICogQGdlbmVyYXRlZA0KKwkvLwkJICovDQorCS8vCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgew0KKwkvLwkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpKTsNCisJLy8JCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkvLwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkvLwkJfQ0KKwkvLw0KKwkvLwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIElucHV0UG9ydEZpZ3VyZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZWEwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzDQorCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAwMjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyB7DQorCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsNCisJCXJldHVybiBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsNCisJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgV3JhcHBpbmdMYWJlbCB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0VGV4dCgiU2luZ2xlSW5wdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTg4YmU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsNCisJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7DQorCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7DQorCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoDQorCQkJCQlnZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsNCisJCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7DQorCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7DQorCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOw0KKwkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQ0KKwkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWludCBwb3NEb3QgPSAtMTsNCisJCWludCBwb3NEb3VibGUgPSAtMTsNCisJCXBvc0RvdCA9IHRleHQubGFzdEluZGV4T2YoIi4iKTsNCisJCXBvc0RvdWJsZSA9IHRleHQuaW5kZXhPZigiOiIpOw0KKwkJaWYgKHBvc0RvdCA+IC0xICYmIHBvc0RvdWJsZSA+IC0xKSB7DQorCQkJU3RyaW5nIGZpcnN0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zRG91YmxlICsgMSk7DQorCQkJU3RyaW5nIHNlY29uZCA9IHRleHQuc3Vic3RyaW5nKHBvc0RvdCArIDEpOw0KKwkJCXRleHQgPSBmaXJzdCArIHNlY29uZDsNCisJCX0NCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIlNpbmdsZUlucHV0UG9ydCIpOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0YjBhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDA2Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJbmV3IFBvaW50KDAsIDApKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7DQorCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOw0KKwkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgew0KKwkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KA0KKwkJCQkJZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7DQorCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsNCisJCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsNCisJCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkNCisJCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpbnQgcG9zRG90ID0gLTE7DQorCQlpbnQgcG9zRG91YmxlID0gLTE7DQorCQlwb3NEb3QgPSB0ZXh0Lmxhc3RJbmRleE9mKCIuIik7DQorCQlwb3NEb3VibGUgPSB0ZXh0LmluZGV4T2YoIjoiKTsNCisJCWlmIChwb3NEb3QgPiAtMSAmJiBwb3NEb3VibGUgPiAtMSkgew0KKwkJCVN0cmluZyBmaXJzdCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc0RvdWJsZSArIDEpOw0KKwkJCVN0cmluZyBzZWNvbmQgPSB0ZXh0LnN1YnN0cmluZyhwb3NEb3QgKyAxKTsNCisJCQl0ZXh0ID0gZmlyc3QgKyBzZWNvbmQ7DQorCQl9DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwOSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJTaW5nbGVJbnB1dFBvcnQiKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODcxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzDQorCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAxMDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyB7DQorCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsNCisJCXJldHVybiBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsNCisJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgV3JhcHBpbmdMYWJlbCB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0VGV4dCgiU2luZ2xlSW5wdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWIwMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMjA7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsNCisJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7DQorCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7DQorCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoDQorCQkJCQlnZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsNCisJCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7DQorCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7DQorCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOw0KKwkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQ0KKwkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWludCBwb3NEb3QgPSAtMTsNCisJCWludCBwb3NEb3VibGUgPSAtMTsNCisJCXBvc0RvdCA9IHRleHQubGFzdEluZGV4T2YoIi4iKTsNCisJCXBvc0RvdWJsZSA9IHRleHQuaW5kZXhPZigiOiIpOw0KKwkJaWYgKHBvc0RvdCA+IC0xICYmIHBvc0RvdWJsZSA+IC0xKSB7DQorCQkJU3RyaW5nIGZpcnN0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zRG91YmxlICsgMSk7DQorCQkJU3RyaW5nIHNlY29uZCA9IHRleHQuc3Vic3RyaW5nKHBvc0RvdCArIDEpOw0KKwkJCXRleHQgPSBmaXJzdCArIHNlY29uZDsNCisJCX0NCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIlNpbmdsZUlucHV0UG9ydCIpOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3ZjhhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMNCisJCUlUZXh0QXdhcmVFZGl0UGFydCwgSUJvcmRlckl0ZW1FZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDIyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbigNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJbmV3IFBvaW50KDAsIDApKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7DQorCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOw0KKwkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgew0KKwkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KA0KKwkJCQkJZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7DQorCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsNCisJCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsNCisJCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkNCisJCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpbnQgcG9zRG90ID0gLTE7DQorCQlpbnQgcG9zRG91YmxlID0gLTE7DQorCQlwb3NEb3QgPSB0ZXh0Lmxhc3RJbmRleE9mKCIuIik7DQorCQlwb3NEb3VibGUgPSB0ZXh0LmluZGV4T2YoIjoiKTsNCisJCWlmIChwb3NEb3QgPiAtMSAmJiBwb3NEb3VibGUgPiAtMSkgew0KKwkJCVN0cmluZyBmaXJzdCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc0RvdWJsZSArIDEpOw0KKwkJCVN0cmluZyBzZWNvbmQgPSB0ZXh0LnN1YnN0cmluZyhwb3NEb3QgKyAxKTsNCisJCQl0ZXh0ID0gZmlyc3QgKyBzZWNvbmQ7DQorCQl9DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNywNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBXcmFwcGluZ0xhYmVsIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJTaW5nbGVJbnB1dFBvcnQiKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZWQwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0IGV4dGVuZHMgTGFiZWxFZGl0UGFydCBpbXBsZW1lbnRzDQorCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNTAyNDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8Pz4gcGFyc2VyRWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyB7DQorCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEsDQorCQkJCQkJCWdldFBhcnNlckVsZW1lbnQoKSwNCisJCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJCS5nZXRUeXBlKGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsNCisJCWlmIChtYW5hZ2VyID09IG51bGwpIHsNCisJCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywNCisJCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLA0KKwkJCQkJQ29tcmVsRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgew0KKwkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7DQorCQlnZXRNYW5hZ2VyKCkuc2hvdygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uDQorCQkJCQkuZ2V0U1dUUG9pbnQoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOw0KKwkJfSBlbHNlIHsNCisJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0Ow0KKwkJdHJ5IHsNCisJCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7DQorCQkJCQkJaWYgKHRoZVJlcXVlc3QNCisJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QNCisJCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsNCisJCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpDQorCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgew0KKwkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7DQorCQkJCQkJfSBlbHNlIHsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9KTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsNCisJCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7DQorCQlyZWZyZXNoTGFiZWwoKTsNCisJCXJlZnJlc2hGb250KCk7DQorCQlyZWZyZXNoRm9udENvbG9yKCk7DQorCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsNCisJCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQ0KKwkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKHN0eWxlLmdldEZvbnROYW1lKCksDQorCQkJCQlzdHlsZS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEDQorCQkJCQkJCTogU1dULk5PUk1BTCkNCisJCQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7DQorCQkJc2V0Rm9udChmb250RGF0YSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpDQorCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJYWRkTGlzdGVuZXJGaWx0ZXIoDQorCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsNCisJCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgew0KKwkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCisJCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gYWNjZXNzaWJsZUVQOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgew0KKwkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgew0KKwkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7DQorCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7DQorCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkNCisJCQkJLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoDQorCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQ0KKwkJCQkJCS5lcXVhbHMoZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKA0KKwkJCQkJCWZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaEZvbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwNCisJCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsDQorCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgew0KKwkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQl9DQorCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOw0KKwkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgew0KKwkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQl9DQorCQkJCQlyZWZyZXNoTGFiZWwoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsNCisJCXJldHVybiBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsNCisJCXJldHVybiBuZXcgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgV3JhcHBpbmdMYWJlbCB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCkgew0KKwkJCXRoaXMuc2V0VGV4dCgiU2luZ2xlSW5wdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTJhNWUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMjY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsNCisJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7DQorCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7DQorCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoDQorCQkJCQlnZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsNCisJCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7DQorCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7DQorCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOw0KKwkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQ0KKwkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWludCBwb3NEb3QgPSAtMTsNCisJCWludCBwb3NEb3VibGUgPSAtMTsNCisJCXBvc0RvdCA9IHRleHQubGFzdEluZGV4T2YoIi4iKTsNCisJCXBvc0RvdWJsZSA9IHRleHQuaW5kZXhPZigiOiIpOw0KKwkJaWYgKHBvc0RvdCA+IC0xICYmIHBvc0RvdWJsZSA+IC0xKSB7DQorCQkJU3RyaW5nIGZpcnN0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zRG91YmxlICsgMSk7DQorCQkJU3RyaW5nIHNlY29uZCA9IHRleHQuc3Vic3RyaW5nKHBvc0RvdCArIDEpOw0KKwkJCXRleHQgPSBmaXJzdCArIHNlY29uZDsNCisJCX0NCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIlNpbmdsZUlucHV0UG9ydCIpOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjQ3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuSUJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDE7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCW5ldyBQb2ludCgwLCAwKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsDQorCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLA0KKwkJCQluZXcgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQm9yZGVySXRlbUxvY2F0b3IgZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKSB7DQorCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOw0KKwkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgew0KKwkJCU9iamVjdCBjb25zdHJhaW50ID0gcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKS5nZXRDb25zdHJhaW50KA0KKwkJCQkJZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7DQorCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9YKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsNCisJCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsNCisJCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkNCisJCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7DQorCQlpbnQgcG9zRG90ID0gLTE7DQorCQlpbnQgcG9zRG91YmxlID0gLTE7DQorCQlwb3NEb3QgPSB0ZXh0Lmxhc3RJbmRleE9mKCIuIik7DQorCQlwb3NEb3VibGUgPSB0ZXh0LmluZGV4T2YoIjoiKTsNCisJCWlmIChwb3NEb3QgPiAtMSAmJiBwb3NEb3VibGUgPiAtMSkgew0KKwkJCVN0cmluZyBmaXJzdCA9IHRleHQuc3Vic3RyaW5nKDAsIHBvc0RvdWJsZSArIDEpOw0KKwkJCVN0cmluZyBzZWNvbmQgPSB0ZXh0LnN1YnN0cmluZyhwb3NEb3QgKyAxKTsNCisJCQl0ZXh0ID0gZmlyc3QgKyBzZWNvbmQ7DQorCQl9DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfSBlbHNlIHsNCisJCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7DQorCQl1bnJlZ2lzdGVyVmlzdWFscygpOw0KKwkJc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOw0KKwkJcmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlyZWZyZXNoVmlzdWFscygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsNCisJCXJldHVybiByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7DQorCQlTdHJpbmcgdGV4dCA9IG51bGw7DQorCQlFT2JqZWN0IHBhcnNlckVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQlpZiAocGFyc2VyRWxlbWVudCAhPSBudWxsICYmIGdldFBhcnNlcigpICE9IG51bGwpIHsNCisJCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIocGFyc2VyRWxlbWVudCksDQorCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgew0KKwkJCXRleHQgPSBkZWZhdWx0VGV4dDsNCisJCX0NCisJCXJldHVybiB0ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLA0KKwkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgew0KKwkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsNCisNCisJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsNCisJCQkJCXRyeSB7DQorCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQ0KKwkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQkJCQkJbmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsPElQYXJzZXJFZGl0U3RhdHVzPigpIHsNCisNCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyDQorCQkJCQkJCQkJCQkJCQkuaXNWYWxpZEVkaXRTdHJpbmcoDQorCQkJCQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCQkJCQkJCQkJCQkJCQllbGVtZW50KSwNCisJCQkJCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsNCisJCQkJCQkJCQkJCX0NCisJCQkJCQkJCQkJfSk7DQorCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbA0KKwkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7DQorCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KKwkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQ0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgew0KKwkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgew0KKwkJaWYgKHBhcnNlciA9PSBudWxsKSB7DQorCQkJcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMjAwMSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7DQorCQlpZiAobWFuYWdlciA9PSBudWxsKSB7DQorCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsDQorCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwNCisJCQkJCUNvbXJlbEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsNCisJCX0NCisJCXJldHVybiBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsNCisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgew0KKwkJZ2V0TWFuYWdlcigpLnNob3coKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgew0KKwkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbg0KKwkJCQkJLmdldFNXVFBvaW50KCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7DQorCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7DQorCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsNCisJCX0gZWxzZSB7DQorCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsNCisJCXRyeSB7DQorCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgew0KKwkJCQkJCWlmICh0aGVSZXF1ZXN0DQorCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkNCisJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3Rlcikgew0KKwkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0DQorCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkJLmdldChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOw0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7DQorCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQ0KKwkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsNCisJCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOw0KKwkJCQkJCX0gZWxzZSB7DQorCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfSk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7DQorCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOw0KKwkJcmVmcmVzaExhYmVsKCk7DQorCQlyZWZyZXNoRm9udCgpOw0KKwkJcmVmcmVzaEZvbnRDb2xvcigpOw0KKwkJcmVmcmVzaFVuZGVybGluZSgpOw0KKwkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7DQorCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUNCisJCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgew0KKwkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOw0KKwkJaWYgKHN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShzdHlsZS5nZXRGb250TmFtZSgpLA0KKwkJCQkJc3R5bGUuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRA0KKwkJCQkJCQk6IFNXVC5OT1JNQUwpDQorCQkJCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOw0KKwkJCXNldEZvbnQoZm9udERhdGEpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgew0KKwkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQ0KKwkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7DQorCQkJCWFkZExpc3RlbmVyRmlsdGVyKA0KKwkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7DQorCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsNCisJCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQorCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7DQorCQkJCX0NCisJCQl9Ow0KKwkJfQ0KKwkJcmV0dXJuIGFjY2Vzc2libGVFUDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsNCisJCXJldHVybiBnZXRQcmltYXJ5VmlldygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7DQorCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7DQorCQlyZXR1cm4gbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7DQorCQlyZXR1cm4gbmV3IFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFRleHQoIlNpbmdsZUlucHV0UG9ydCIpOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2YyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsMzMyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5PdXRwdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZU91dHB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5PdXRwdXRQb3J0RmlndXJlOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCBleHRlbmRzIEJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMTg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQlnZXRQcmltYXJ5RHJhZ0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZU91dHB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKSB7DQorDQorCQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsNCisJCQkJCQkJTW92ZUhhbmRsZSBtaCA9IG5ldyBNb3ZlSGFuZGxlKA0KKwkJCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsNCisJCQkJCQkJbWguc2V0Qm9yZGVyKG51bGwpOw0KKwkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtaCk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVPdXRwdXRQb3J0RmlndXJlIGZpZ3VyZSA9IG5ldyBTaW5nbGVPdXRwdXRQb3J0RmlndXJlKCk7DQorCQlPdXRwdXRQb3J0IHBvcnQgPSAoT3V0cHV0UG9ydCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQlmaWd1cmUuc2V0UG9ydChwb3J0KTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlT3V0cHV0UG9ydEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRCb3JkZXJJdGVtKElGaWd1cmUgYm9yZGVySXRlbUNvbnRhaW5lciwNCisJCQlJQm9yZGVySXRlbUVkaXRQYXJ0IGJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Qm9yZGVySXRlbU9mZnNldChuZXcgRGltZW5zaW9uKC0yMCwgLTIwKSk7DQorCQkJYm9yZGVySXRlbUNvbnRhaW5lci5hZGQoYm9yZGVySXRlbUVkaXRQYXJ0LmdldEZpZ3VyZSgpLCBsb2NhdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkQm9yZGVySXRlbShib3JkZXJJdGVtQ29udGFpbmVyLCBib3JkZXJJdGVtRWRpdFBhcnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSgyMCwgMjApOw0KKw0KKwkJLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgIzE1NDUzNg0KKwkJcmVzdWx0LmdldEJvdW5kcygpLnNldFNpemUocmVzdWx0LmdldFByZWZlcnJlZFNpemUoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZSgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDEpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBPdXRwdXRQb3J0RmlndXJlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2YjVmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDMzMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkJvcmRlcmVkQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuT3V0cHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVPdXRwdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5PdXRwdXRQb3J0RmlndXJlOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0IGV4dGVuZHMgQm9yZGVyZWRCb3JkZXJJdGVtRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAxMTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVPdXRwdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpIHsNCisNCisJCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgew0KKwkJCQkJCQlNb3ZlSGFuZGxlIG1oID0gbmV3IE1vdmVIYW5kbGUoDQorCQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOw0KKwkJCQkJCQltaC5zZXRCb3JkZXIobnVsbCk7DQorCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1oKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVNpbmdsZU91dHB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZU91dHB1dFBvcnRGaWd1cmUoKTsNCisJCU91dHB1dFBvcnQgcG9ydCA9IChPdXRwdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCWZpZ3VyZS5zZXRQb3J0KHBvcnQpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVPdXRwdXRQb3J0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLA0KKwkJCUlCb3JkZXJJdGVtRWRpdFBhcnQgYm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQlpZiAoYm9yZGVySXRlbUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsNCisJCQlsb2NhdG9yLnNldEJvcmRlckl0ZW1PZmZzZXQobmV3IERpbWVuc2lvbigtMjAsIC0yMCkpOw0KKwkJCWJvcmRlckl0ZW1Db250YWluZXIuYWRkKGJvcmRlckl0ZW1FZGl0UGFydC5nZXRGaWd1cmUoKSwgbG9jYXRvcik7DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLmFkZEJvcmRlckl0ZW0oYm9yZGVySXRlbUNvbnRhaW5lciwgYm9yZGVySXRlbUVkaXRQYXJ0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoMjAsIDIwKTsNCisNCisJCS8vRklYTUU6IHdvcmthcm91bmQgZm9yICMxNTQ1MzYNCisJCXJlc3VsdC5nZXRCb3VuZHMoKS5zZXRTaXplKHJlc3VsdC5nZXRQcmVmZXJyZWRTaXplKCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZU91dHB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdDxJRWxlbWVudFR5cGU+IGdldE1BUmVsVHlwZXNPblNvdXJjZSgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDEpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoDQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsNCisJCX0NCisJCXJldHVybiB0eXBlczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3Q8SUVsZW1lbnRUeXBlPiBnZXRNQVR5cGVzRm9yVGFyZ2V0KElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlMaW5rZWRMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgTGlua2VkTGlzdDxJRWxlbWVudFR5cGU+KCk7DQorCQlpZiAocmVsYXRpb25zaGlwVHlwZSA9PSBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSkgew0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJfQ0KKwkJcmV0dXJuIHR5cGVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBPdXRwdXRQb3J0RmlndXJlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMjApKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5MTIwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLklCb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxQYXJzZXJQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMTU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJbmV3IFBvaW50KDAsIDApKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgew0KKwkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsNCisJCWlmIChwYXJlbnRGaWd1cmUgIT0gbnVsbCAmJiBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpICE9IG51bGwpIHsNCisJCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgNCisJCQkJCWdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gKElCb3JkZXJJdGVtTG9jYXRvcikgY29uc3RyYWludDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgew0KKwkJaW50IHggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsNCisJCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7DQorCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsNCisJCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7DQorCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpDQorCQkJCS5zZXRDb25zdHJhaW50KG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaW50IHBvc0RvdCA9IC0xOw0KKwkJaW50IHBvc0RvdWJsZSA9IC0xOw0KKwkJcG9zRG90ID0gdGV4dC5sYXN0SW5kZXhPZigiLiIpOw0KKwkJcG9zRG91YmxlID0gdGV4dC5pbmRleE9mKCI6Iik7DQorCQlpZiAocG9zRG90ID4gLTEgJiYgcG9zRG91YmxlID4gLTEpIHsNCisJCQlTdHJpbmcgZmlyc3QgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3NEb3VibGUgKyAxKTsNCisJCQlTdHJpbmcgc2Vjb25kID0gdGV4dC5zdWJzdHJpbmcocG9zRG90ICsgMSk7DQorCQkJdGV4dCA9IGZpcnN0ICsgc2Vjb25kOw0KKwkJfQ0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBTaW5nbGVPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJTaW5nbGVPdXRwdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZU91dHB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWI1YTQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZU91dHB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRleHRBd2FyZUVkaXRQYXJ0LCBJQm9yZGVySXRlbUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDg7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJcmVnaXN0ZXJTbmFwQmFja1Bvc2l0aW9uKA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQluZXcgUG9pbnQoMCwgMCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsNCisJCUlGaWd1cmUgcGFyZW50RmlndXJlID0gZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCk7DQorCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7DQorCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoDQorCQkJCQlnZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsNCisJCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7DQorCQlpbnQgeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOw0KKwkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7DQorCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOw0KKwkJZ2V0Qm9yZGVySXRlbUxvY2F0b3IoKQ0KKwkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWludCBwb3NEb3QgPSAtMTsNCisJCWludCBwb3NEb3VibGUgPSAtMTsNCisJCXBvc0RvdCA9IHRleHQubGFzdEluZGV4T2YoIi4iKTsNCisJCXBvc0RvdWJsZSA9IHRleHQuaW5kZXhPZigiOiIpOw0KKwkJaWYgKHBvc0RvdCA+IC0xICYmIHBvc0RvdWJsZSA+IC0xKSB7DQorCQkJU3RyaW5nIGZpcnN0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zRG91YmxlICsgMSk7DQorCQkJU3RyaW5nIHNlY29uZCA9IHRleHQuc3Vic3RyaW5nKHBvc0RvdCArIDEpOw0KKwkJCXRleHQgPSBmaXJzdCArIHNlY29uZDsNCisJCX0NCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsNCisJCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsNCisJCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoVW5kZXJsaW5lKCk7DQorCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQ0KKwkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7DQorCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygNCisJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkNCisJCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpDQorCQkJCQkJLmVxdWFscyhmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoDQorCQkJCQkJZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoRm9udCgpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbA0KKwkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwNCisJCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7DQorCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCX0NCisJCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsNCisJCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7DQorCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7DQorCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7DQorCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCQkJCX0NCisJCQkJCXJlZnJlc2hMYWJlbCgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOw0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgew0KKwkJcmV0dXJuIG5ldyBTaW5nbGVPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIFdyYXBwaW5nTGFiZWwgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRUZXh0KCJTaW5nbGVPdXRwdXRQb3J0Iik7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3YTFhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3RhdGFibGVEZWNvcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uTm9kZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVHJlZUJyYW5jaEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLlBvcnRNYXBwaW5nRmlndXJlOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydCBleHRlbmRzIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgaW1wbGVtZW50cw0KKwkJSVRyZWVCcmFuY2hFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlUG9ydE1hcHBpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorDQorCXByb3RlY3RlZCBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKSB7DQorCQlQb3J0TWFwcGluZyBtYXBwaW5nID0gKFBvcnRNYXBwaW5nKSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCVNpbmdsZVBvcnRNYXBwaW5nRmlndXJlIGZpZ3VyZSA9IG5ldyBTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSgpOw0KKwkJZmlndXJlLnNldE1hcHBpbmcobWFwcGluZyk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSkgZ2V0RmlndXJlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmUgZXh0ZW5kcyBQb3J0TWFwcGluZ0ZpZ3VyZSB7DQorDQorCQlTaW5nbGVQb3J0TWFwcGluZyBtYXBwaW5nOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldExpbmVXaWR0aCgyKTsNCisJCQl0aGlzLnNldExpbmVTdHlsZShHcmFwaGljcy5MSU5FX0RPVCk7DQorDQorCQkJc2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUm90YXRhYmxlRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgew0KKwkJCVBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBQb2x5bGluZURlY29yYXRpb24oKTsNCisJCQlyZXR1cm4gZGY7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0ZmI0NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuU2luZ2xlUXVldWVkVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAyMjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVRdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlNpbmdsZVF1ZXVlZFVuaXQiKTsNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyNDI5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuU2luZ2xlUXVldWVkVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA0MjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVRdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJTaW5nbGVRdWV1ZWRVbml0Iik7DQorCQkJZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWUwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlNpbmdsZVF1ZXVlZFVuaXRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuY3VzdG9tLkxhYmVsczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5PcGVuRGlhZ3JhbUVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZVF1ZXVlZFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwNTQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsDQorCQkJCW5ldyBPcGVuRGlhZ3JhbUVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJLy8JCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkvLwkJdW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCkgew0KKwkJCSgoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y3YzhmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5TaW5nbGVRdWV1ZWRVbml0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLmN1c3RvbS5MYWJlbHM7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuT3BlbkRpYWdyYW1FZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZVF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDU5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuT1BFTl9ST0xFLA0KKwkJCQluZXcgT3BlbkRpYWdyYW1FZGl0UG9saWN5KCkpOw0KKwkJLy8gWFhYIG5lZWQgYW4gU0NSIHRvIHJ1bnRpbWUgdG8gaGF2ZSBhbm90aGVyIGFic3RyYWN0IHN1cGVyY2xhc3MgdGhhdCB3b3VsZCBsZXQgY2hpbGRyZW4gYWRkIHJlYXNvbmFibGUgZWRpdHBvbGljaWVzDQorCQkvLyByZW1vdmVFZGl0UG9saWN5KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlcy5DT05ORUNUSU9OX0hBTkRMRVNfUk9MRSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7DQorCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5KCkgew0KKw0KKwkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgew0KKwkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOw0KKwkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY2hpbGRWaWV3KSkgew0KKwkJCQljYXNlIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQNCisJCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7DQorCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOw0KKwkJCQl9DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9Ow0KKwkJcmV0dXJuIGxlcDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsNCisJCVNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUoKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wSGVscGVyID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkNCisJCQkJLmdldCgxKTsNCisJCVJlY3RhbmdsZUZpZ3VyZSBjb21wUmVmID0gKFJlY3RhbmdsZUZpZ3VyZSkgZmlndXJlLmdldENoaWxkcmVuKCkuZ2V0KDIpOw0KKwkJTGFiZWxzLnNldExhYmVscyhjb21wSGVscGVyLCBjb21wUmVmLCB0cnVlKTsNCisJCS8vCQlSZWZhY3RvcmluZ1VuaXQgdW5pdCA9IChSZWZhY3RvcmluZ1VuaXQpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJLy8JCXVuaXQuc2V0RmlndXJlKGZpZ3VyZSk7DQorCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7DQorCQlyZXR1cm4gKFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUpIHByaW1hcnlTaGFwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQpIHsNCisJCQkoKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCS8vCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCS8vCQkJCQkoKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgew0KKwkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgew0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCk7DQorCQl9DQorCQlyZXR1cm4gZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgew0KKwkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoNDAsIDQwKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4NCisJICogDQorCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwNCisJICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVNYWluRmlndXJlKCkgew0KKwkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsNCisJCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsNCisJCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsNCisJCWZpZ3VyZS5hZGQoc2hhcGUpOw0KKwkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLg0KKwkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4NCisJICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsNCisJCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsNCisJCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOw0KKwkJCWxheW91dC5zZXRTcGFjaW5nKDUpOw0KKwkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7DQorCQl9DQorCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsNCisJCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGNvbnRlbnRQYW5lOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KKwkJaWYgKHByaW1hcnlTaGFwZSAhPSBudWxsKSB7DQorCQkJcHJpbWFyeVNoYXBlLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVXaWR0aChpbnQgd2lkdGgpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVdpZHRoKHdpZHRoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVR5cGUoaW50IHN0eWxlKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVTdHlsZShzdHlsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsNCisJCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlNpbmdsZVF1ZXVlZFVuaXQiKTsNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiNzI2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Cb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkJvcmRlckl0ZW1Mb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuU2luZ2xlUXVldWVkVW5pdEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA2NTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQkvLwkJUmVmYWN0b3JpbmdVbml0IHVuaXQgPSAoUmVmYWN0b3JpbmdVbml0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCS8vCQl1bml0LnNldEZpZ3VyZShmaWd1cmUpOw0KKwkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgew0KKwkJcmV0dXJuIChTaW5nbGVRdWV1ZWRVbml0RmlndXJlKSBwcmltYXJ5U2hhcGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCQkJLmdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydCkgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLnJlbW92ZSgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkucmVtb3ZlKA0KKwkJCQkJKChTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQkvLwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkvLwkJCQkJKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsNCisJCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsNCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJQm9yZGVySXRlbUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuIGdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldENvbnRlbnRQYW5lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsNCisJCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKDQwLCA0MCk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuDQorCSAqIA0KKwkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsDQorCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsNCisJCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7DQorCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7DQorCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7DQorCQlmaWd1cmUuYWRkKHNoYXBlKTsNCisJCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7DQorCQlyZXR1cm4gZmlndXJlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4NCisJICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuDQorCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7DQorCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7DQorCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsNCisJCQlsYXlvdXQuc2V0U3BhY2luZyg1KTsNCisJCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOw0KKwkJfQ0KKwkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7DQorCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb250ZW50UGFuZTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgIT0gbnVsbCkgew0KKwkJCXByaW1hcnlTaGFwZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lV2lkdGgoaW50IHdpZHRoKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlIGluc3RhbmNlb2YgU2hhcGUpIHsNCisJCQkoKFNoYXBlKSBwcmltYXJ5U2hhcGUpLnNldExpbmVXaWR0aCh3aWR0aCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExpbmVUeXBlKGludCBzdHlsZSkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lU3R5bGUoc3R5bGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBSb3VuZGVkUmVjdGFuZ2xlIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSgpIHsNCisJCQl0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSkpOw0KKwkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKSk7DQorCQkJY3JlYXRlQ29udGVudHMoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7DQorDQorCQkJZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBXcmFwcGluZ0xhYmVsKCk7DQorCQkJZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCJTaW5nbGVRdWV1ZWRVbml0Iik7DQorCQkJZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKSk7DQorDQorCQkJdGhpcy5hZGQoZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7DQorDQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsNCisNCisJCQl0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKwkJfQ0KKw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODRlODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsNDM3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5jdXN0b20uTGFiZWxzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLk9wZW5EaWFncmFtRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzA2NzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwNCisJCQkJbmV3IE9wZW5EaWFncmFtRWRpdFBvbGljeSgpKTsNCisJCS8vIFhYWCBuZWVkIGFuIFNDUiB0byBydW50aW1lIHRvIGhhdmUgYW5vdGhlciBhYnN0cmFjdCBzdXBlcmNsYXNzIHRoYXQgd291bGQgbGV0IGNoaWxkcmVuIGFkZCByZWFzb25hYmxlIGVkaXRwb2xpY2llcw0KKwkJLy8gcmVtb3ZlRWRpdFBvbGljeShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXMuQ09OTkVDVElPTl9IQU5ETEVTX1JPTEUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgew0KKwkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsNCisJCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGQuZ2V0TW9kZWwoKTsNCisJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNoaWxkVmlldykpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCXJldHVybiBuZXcgQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkDQorCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJCXJldHVybiBsZXA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7DQorCQlTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGZpZ3VyZSA9IG5ldyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpDQorCQkJCS5nZXQoMSk7DQorCQlSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCisJCUxhYmVscy5zZXRMYWJlbHMoY29tcEhlbHBlciwgY29tcFJlZiwgdHJ1ZSk7DQorCQlSZWZhY3RvcmluZ1VuaXQgdW5pdCA9IChSZWZhY3RvcmluZ1VuaXQpIHRoaXMucmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwkJdW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydCkgew0KKwkJCSgoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkJCS5nZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUuYWRkKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUlGaWd1cmUgcGFuZSA9IGdldFByaW1hcnlTaGFwZSgpDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwNCisJCQkJCWxvY2F0b3IpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCUJvcmRlckl0ZW1Mb2NhdG9yIGxvY2F0b3IgPSBuZXcgQm9yZGVySXRlbUxvY2F0b3IoZ2V0TWFpbkZpZ3VyZSgpLA0KKwkJCQkJUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KKwkJCWxvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWxvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJZ2V0Qm9yZGVyZWRGaWd1cmUoKS5nZXRCb3JkZXJJdGVtQ29udGFpbmVyKCkuYWRkKA0KKwkJCQkJKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXcmFwcGluZ0xhYmVsIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7DQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBSZWN0YW5nbGVGaWd1cmUgZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUoKSB7DQorCQkJdGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoOCkpKTsNCisJCQl0aGlzLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSkpOw0KKwkJCWNyZWF0ZUNvbnRlbnRzKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgew0KKw0KKwkJCWZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgV3JhcHBpbmdMYWJlbCgpOw0KKwkJCWZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgiU2luZ2xlUXVldWVkVW5pdCIpOw0KKwkJCWZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbigNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSkpOw0KKw0KKwkJCXRoaXMuYWRkKGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOw0KKw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsNCisNCisJCQlmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7DQorDQorCQkJdGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFdyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkgew0KKwkJCXJldHVybiBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBSZWN0YW5nbGVGaWd1cmUgZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5OGZmZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDQ1MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklCb3JkZXJJdGVtRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlNpbmdsZVF1ZXVlZFVuaXRGaWd1cmU7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuY3VzdG9tLkxhYmVsczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5PcGVuRGlhZ3JhbUVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Qm9yZGVyZWRTaGFwZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsDQorCQkJCW5ldyBPcGVuRGlhZ3JhbUVkaXRQb2xpY3koKSk7DQorCQkvLyBYWFggbmVlZCBhbiBTQ1IgdG8gcnVudGltZSB0byBoYXZlIGFub3RoZXIgYWJzdHJhY3Qgc3VwZXJjbGFzcyB0aGF0IHdvdWxkIGxldCBjaGlsZHJlbiBhZGQgcmVhc29uYWJsZSBlZGl0cG9saWNpZXMNCisJCS8vIHJlbW92ZUVkaXRQb2xpY3kob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzLkNPTk5FQ1RJT05fSEFORExFU19ST0xFKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsNCisJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3koKSB7DQorDQorCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7DQorCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkLmdldE1vZGVsKCk7DQorCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjaGlsZFZpZXcpKSB7DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZA0KKwkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorDQorCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCQlyZXR1cm4gbGVwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgew0KKwkJU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSBmaWd1cmUgPSBuZXcgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSgpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKQ0KKwkJCQkuZ2V0KDEpOw0KKwkJUmVjdGFuZ2xlRmlndXJlIGNvbXBSZWYgPSAoUmVjdGFuZ2xlRmlndXJlKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMik7DQorCQlMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KKwkJLy8JCVJlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQorCQkvLwkJdW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCisJCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsNCisJCXJldHVybiAoU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSkgcHJpbWFyeVNoYXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0KSB7DQorCQkJKChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJCQkuZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCk7DQorCQkJc2V0dXBDb250ZW50UGFuZShwYW5lKTsgLy8gRklYTUUgZWFjaCBjb21wYXJtZW50IHNob3VsZCBoYW5kbGUgaGlzIGNvbnRlbnQgcGFuZSBpbiBoaXMgb3duIHdheSANCisJCQlwYW5lLmFkZCgoKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlJRmlndXJlIHBhbmUgPSBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5hZGQoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQ0KKwkJCQkJLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJQm9yZGVySXRlbUxvY2F0b3IgbG9jYXRvciA9IG5ldyBCb3JkZXJJdGVtTG9jYXRvcihnZXRNYWluRmlndXJlKCksDQorCQkJCQlQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7DQorCQkJbG9jYXRvci5zZXRDdXJyZW50U2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorCQkJbG9jYXRvci5zZXRQcmVmZXJyZWRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5hZGQoDQorCQkJCQkoKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCksDQorCQkJCQlsb2NhdG9yKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwNCisJCQkJCVBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsNCisJCQlsb2NhdG9yLnNldEN1cnJlbnRTaWRlT2ZQYXJlbnQoUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOyAvLyBQb3NpdGlvbiBkZXMgUG9ydHMNCisJCQlsb2NhdG9yLnNldFByZWZlcnJlZFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLmFkZCgNCisJCQkJCSgoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpLA0KKwkJCQkJbG9jYXRvcik7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsNCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJCXNldHVwQ29udGVudFBhbmUocGFuZSk7IC8vIEZJWE1FIGVhY2ggY29tcGFybWVudCBzaG91bGQgaGFuZGxlIGhpcyBjb250ZW50IHBhbmUgaW4gaGlzIG93biB3YXkgDQorCQkJcGFuZS5yZW1vdmUoKChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpDQorCQkJCQkuZ2V0RmlndXJlKCkpOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJSUZpZ3VyZSBwYW5lID0gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKTsNCisJCQlzZXR1cENvbnRlbnRQYW5lKHBhbmUpOyAvLyBGSVhNRSBlYWNoIGNvbXBhcm1lbnQgc2hvdWxkIGhhbmRsZSBoaXMgY29udGVudCBwYW5lIGluIGhpcyBvd24gd2F5IA0KKwkJCXBhbmUucmVtb3ZlKCgoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkNCisJCQkJCS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCWdldEJvcmRlcmVkRmlndXJlKCkuZ2V0Qm9yZGVySXRlbUNvbnRhaW5lcigpLnJlbW92ZSgNCisJCQkJCSgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB7DQorCQkJLy8JCQlnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKS5yZW1vdmUoDQorCQkJLy8JCQkJCSgoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpKTsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7DQorCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgew0KKwkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gZ2V0UHJpbWFyeVNoYXBlKCkNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRQcmltYXJ5U2hhcGUoKQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgew0KKwkJCXJldHVybiBnZXRCb3JkZXJlZEZpZ3VyZSgpLmdldEJvcmRlckl0ZW1Db250YWluZXIoKTsNCisJCX0NCisJCXJldHVybiBnZXRDb250ZW50UGFuZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7DQorCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZSg0MCwgNDApOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0Lg0KKwkgKiANCisJICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbA0KKwkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU1haW5GaWd1cmUoKSB7DQorCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOw0KKwkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOw0KKwkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOw0KKwkJZmlndXJlLmFkZChzaGFwZSk7DQorCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOw0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwkvKioNCisJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuDQorCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLg0KKwkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgew0KKwkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgew0KKwkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7DQorCQkJbGF5b3V0LnNldFNwYWNpbmcoNSk7DQorCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsNCisJCX0NCisJCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgew0KKwkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsNCisJCQlyZXR1cm4gY29udGVudFBhbmU7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlpZiAocHJpbWFyeVNoYXBlICE9IG51bGwpIHsNCisJCQlwcmltYXJ5U2hhcGUuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGluZVdpZHRoKGludCB3aWR0aCkgew0KKwkJaWYgKHByaW1hcnlTaGFwZSBpbnN0YW5jZW9mIFNoYXBlKSB7DQorCQkJKChTaGFwZSkgcHJpbWFyeVNoYXBlKS5zZXRMaW5lV2lkdGgod2lkdGgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMaW5lVHlwZShpbnQgc3R5bGUpIHsNCisJCWlmIChwcmltYXJ5U2hhcGUgaW5zdGFuY2VvZiBTaGFwZSkgew0KKwkJCSgoU2hhcGUpIHByaW1hcnlTaGFwZSkuc2V0TGluZVN0eWxlKHN0eWxlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgew0KKwkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7DQorCQlpZiAoZXZlbnQuZ2V0Tm90aWZpZXIoKSA9PSBnZXRNb2RlbCgpDQorCQkJCSYmIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU1vZGVsRWxlbWVudF9FQW5ub3RhdGlvbnMoKQ0KKwkJCQkJCS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgew0KKwkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsNCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIFJvdW5kZWRSZWN0YW5nbGUgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCkgew0KKwkJCXRoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCksDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKSk7DQorCQkJdGhpcy5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpLA0KKwkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSwNCisJCQkJCWdldE1hcE1vZGUoKS5EUHRvTFAoNSkpKTsNCisJCQljcmVhdGVDb250ZW50cygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsNCisNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IFdyYXBwaW5nTGFiZWwoKTsNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoIlNpbmdsZVF1ZXVlZFVuaXQiKTsNCisJCQlmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oDQorCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpKTsNCisNCisJCQl0aGlzLmFkZChmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKTsNCisNCisJCQlmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7DQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7DQorDQorCQkJZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOw0KKw0KKwkJCXRoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOw0KKw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBXcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsNCisJCQlyZXR1cm4gZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgew0KKwkJCXJldHVybiBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7DQorCQkJcmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZDQ2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDc2Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzgwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDY5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDQyLA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmZlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDY0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTQyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDYzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTRmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDYxOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDY1LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTJhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQgZXh0ZW5kcw0KKwkJQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA1MDQ5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTGlzdDw/PiBwYXJzZXJFbGVtZW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydChWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwNCisJCQkJbmV3IENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLA0KKwkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTm9kZUxhYmVsRHJhZ1BvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJcmV0dXJuICgoV3JhcHBpbmdMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9IGVsc2Ugew0KKwkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0gZWxzZSB7DQorCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwcGluZ0xhYmVsIGZpZ3VyZSkgew0KKwkJdW5yZWdpc3RlclZpc3VhbHMoKTsNCisJCXNldEZpZ3VyZShmaWd1cmUpOw0KKwkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsNCisJCXJlZ2lzdGVyVmlzdWFscygpOw0KKwkJcmVmcmVzaFZpc3VhbHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7DQorCQlyZXR1cm4gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgew0KKwkJU3RyaW5nIHRleHQgPSBudWxsOw0KKwkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOw0KKwkJaWYgKHBhcnNlckVsZW1lbnQgIT0gbnVsbCAmJiBnZXRQYXJzZXIoKSAhPSBudWxsKSB7DQorCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHBhcnNlckVsZW1lbnQpLA0KKwkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsNCisJCQl0ZXh0ID0gZGVmYXVsdFRleHQ7DQorCQl9DQorCQlyZXR1cm4gdGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7DQorCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOw0KKwkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7DQorCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwkJT2JqZWN0IHNmRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSk7DQorCQlpZiAoc2ZFZGl0UG9saWN5IGluc3RhbmNlb2YgQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsNCisJCQkoKENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBzZkVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwNCisJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgew0KKwkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsNCisJCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7DQorDQorCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkNCisJCQkJCQkJCS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCQkJCW5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbDxJUGFyc2VyRWRpdFN0YXR1cz4oKSB7DQorDQorCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlcg0KKwkJCQkJCQkJCQkJCQkJLmlzVmFsaWRFZGl0U3RyaW5nKA0KKwkJCQkJCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQkJCQkJCQkJCQkJCQkJZWxlbWVudCksDQorCQkJCQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7DQorCQkJCQkJCQkJCQl9DQorCQkJCQkJCQkJCX0pOw0KKwkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwNCisJCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOw0KKwkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCisJCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7DQorCQlpZiAoZ2V0UGFyc2VyRWxlbWVudCgpID09IG51bGwgfHwgZ2V0UGFyc2VyKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoDQorCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsNCisJCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsNCisJCWlmIChwYXJzZXIgPT0gbnVsbCkgew0KKwkJCXBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDY3LA0KKwkJCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksDQorCQkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0VHlwZShjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGU2YTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw1NzYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsUGFyc2VyUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCBleHRlbmRzDQorCQlDb21wYXJ0bWVudEVkaXRQYXJ0IGltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwODI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBMaXN0PD8+IHBhcnNlckVsZW1lbnRzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQoVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsDQorCQkJCW5ldyBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwNCisJCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk5vZGVMYWJlbERyYWdQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7DQorCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCXJldHVybiAoKFdyYXBwaW5nTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgew0KKwkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQlyZXR1cm4gKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLmdldEljb24oKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsNCisJCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7DQorCQl9IGVsc2Ugew0KKwkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcHBpbmdMYWJlbCBmaWd1cmUpIHsNCisJCXVucmVnaXN0ZXJWaXN1YWxzKCk7DQorCQlzZXRGaWd1cmUoZmlndXJlKTsNCisJCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7DQorCQlyZWdpc3RlclZpc3VhbHMoKTsNCisJCXJlZnJlc2hWaXN1YWxzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgew0KKwkJcmV0dXJuIHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsNCisJCVN0cmluZyB0ZXh0ID0gbnVsbDsNCisJCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsNCisJCWlmIChwYXJzZXJFbGVtZW50ICE9IG51bGwgJiYgZ2V0UGFyc2VyKCkgIT0gbnVsbCkgew0KKwkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihwYXJzZXJFbGVtZW50KSwNCisJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJdGV4dCA9IGRlZmF1bHRUZXh0Ow0KKwkJfQ0KKwkJcmV0dXJuIHRleHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgew0KKwkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsNCisJCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOw0KKwkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJCU9iamVjdCBzZkVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpOw0KKwkJaWYgKHNmRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7DQorCQkJKChDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgc2ZFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsNCisJCWlmIChnZXRQYXJzZXJFbGVtZW50KCkgPT0gbnVsbCB8fCBnZXRQYXJzZXIoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygNCisJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksDQorCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsNCisJCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7DQorCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgew0KKw0KKwkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7DQorCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOw0KKwkJCQkJdHJ5IHsNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkucnVuRXhjbHVzaXZlKA0KKwkJCQkJCQkJCQluZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGw8SVBhcnNlckVkaXRTdGF0dXM+KCkgew0KKw0KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXINCisJCQkJCQkJCQkJCQkJCS5pc1ZhbGlkRWRpdFN0cmluZygNCisJCQkJCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJCQkJCQkJCQkJCQkJCWVsZW1lbnQpLA0KKwkJCQkJCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOw0KKwkJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQl9KTsNCisJCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsDQorCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsNCisJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQorCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlDQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgew0KKwkJaWYgKGdldFBhcnNlckVsZW1lbnQoKSA9PSBudWxsIHx8IGdldFBhcnNlcigpID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKA0KKwkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7DQorCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7DQorCQlpZiAocGFyc2VyID09IG51bGwpIHsNCisJCQlwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkJLmdldFBhcnNlcigNCisJCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCwNCisJCQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLA0KKwkJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkJLmdldFR5cGUoY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiBwYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgew0KKwkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgew0KKwkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLA0KKwkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksDQorCQkJCQlDb21yZWxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7DQorCQl9DQorCQlyZXR1cm4gbWFuYWdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7DQorCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsNCisJCWdldE1hbmFnZXIoKS5zaG93KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsNCisJCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsNCisJCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24NCisJCQkJCS5nZXRTV1RQb2ludCgpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3Rlcikgew0KKwkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgew0KKwkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7DQorCQl9IGVsc2Ugew0KKwkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7DQorCQl0cnkgew0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsNCisJCQkJCQlpZiAodGhlUmVxdWVzdA0KKwkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpDQorCQkJCQkJCQkuZ2V0KFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsNCisJCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdA0KKwkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQ0KKwkJCQkJCQkJCS5nZXQoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsNCisJCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOw0KKwkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkNCisJCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7DQorCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0Ow0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0pOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgew0KKwkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsNCisJCXJlZnJlc2hMYWJlbCgpOw0KKwkJcmVmcmVzaEZvbnQoKTsNCisJCXJlZnJlc2hGb250Q29sb3IoKTsNCisJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsNCisJCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOw0KKwkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7DQorCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsNCisJCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCQlPYmplY3Qgc2ZFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKTsNCisJCWlmIChzZkVkaXRQb2xpY3kgaW5zdGFuY2VvZiBDb21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgew0KKwkJCSgoQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHNmRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7DQorCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7DQorCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlDQorCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsNCisJCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsNCisJCWlmIChzdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoc3R5bGUuZ2V0Rm9udE5hbWUoKSwNCisJCQkJCXN0eWxlLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQNCisJCQkJCQkJOiBTV1QuTk9STUFMKQ0KKwkJCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsNCisJCQlzZXRGb250KGZvbnREYXRhKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7DQorCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsNCisJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCisJCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkNCisJCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgew0KKwkJCQlhZGRMaXN0ZW5lckZpbHRlcigNCisJCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7DQorCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsNCisJCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgew0KKwkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7DQorCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsNCisNCisJCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KKwkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBhY2Nlc3NpYmxlRVA7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7DQorCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsNCisJCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsNCisJCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7DQorCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7DQorCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsNCisJCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOw0KKwkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgew0KKwkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOw0KKwkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hVbmRlcmxpbmUoKTsNCisJCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpDQorCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsNCisJCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOw0KKwkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKA0KKwkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKQ0KKwkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkNCisJCQkJCQkuZXF1YWxzKGZlYXR1cmUpDQorCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygNCisJCQkJCQlmZWF0dXJlKSkgew0KKwkJCXJlZnJlc2hGb250KCk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsDQorCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LA0KKwkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsNCisJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJfQ0KKwkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgew0KKwkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsNCisJCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsNCisJCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7DQorCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsNCisJCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOw0KKwkJCQkJfQ0KKwkJCQkJcmVmcmVzaExhYmVsKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2ViMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0DQorCQlleHRlbmRzIFNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDI3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4NjRiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNDM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjc3NDAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA0NTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MjY3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0DQorCQlleHRlbmRzIFNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDQ5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCgNCisJCQlWaWV3IHZpZXcpIHsNCisJCXN1cGVyKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldENvbXBhcnRtZW50TmFtZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldFJhdGlvKERvdWJsZSByYXRpbykgew0KKwkJaWYgKGdldEZpZ3VyZSgpLmdldFBhcmVudCgpLmdldExheW91dE1hbmFnZXIoKSBpbnN0YW5jZW9mIENvbnN0cmFpbmVkVG9vbGJhckxheW91dCkgew0KKwkJCXN1cGVyLnNldFJhdGlvKHJhdGlvKTsNCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0ZmZkMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNyZWF0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRHJhZ0Ryb3BFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQNCisJCWV4dGVuZHMgU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDcwNTU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgew0KKwkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcg0KKwkJCQkuY3JlYXRlRmlndXJlKCk7DQorCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7DQorCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLA0KKwkJCQluZXcgUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLA0KKwkJCQluZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwNCisJCQkJbmV3IENyZWF0aW9uRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5EUkFHX0RST1BfUk9MRSwNCisJCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGFiZjZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA3NzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmRmZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DcmVhdGlvbkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5SZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0DQorCQlleHRlbmRzIFNoYXBlQ29tcGFydG1lbnRFZGl0UGFydCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3MDA5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsDQorCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsDQorCQkJCW5ldyBEcmFnRHJvcEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KKwkJCQluZXcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZGJjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAyODsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmRiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA0NDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjk2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA0NjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA1MDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODljNzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA1NjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGI0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzA3ODsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0KA0KKwkJCVZpZXcgdmlldykgew0KKwkJc3VwZXIodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgew0KKwkJcmV0dXJuIE1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsNCisJCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXINCisJCQkJLmNyZWF0ZUZpZ3VyZSgpOw0KKwkJcmVzdWx0LnNldFRpdGxlVmlzaWJpbGl0eShmYWxzZSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgew0KKwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwNCisJCQkJbmV3IFJlc2l6YWJsZUNvbXBhcnRtZW50RWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KA0KKwkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7DQorCQlpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkuZ2V0TGF5b3V0TWFuYWdlcigpIGluc3RhbmNlb2YgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KSB7DQorCQkJc3VwZXIuc2V0UmF0aW8ocmF0aW8pOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wYXJ0cy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2YyNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5EcmFnRHJvcEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlQ29tcGFydG1lbnRFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydA0KKwkJZXh0ZW5kcyBTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNzAxMDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQoDQorCQkJVmlldyB2aWV3KSB7DQorCQlzdXBlcih2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7DQorCQlyZXR1cm4gTWVzc2FnZXMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7DQorCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyDQorCQkJCS5jcmVhdGVGaWd1cmUoKTsNCisJCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsNCisJCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsDQorCQkJCW5ldyBSZXNpemFibGVDb21wYXJ0bWVudEVkaXRQb2xpY3koKSk7DQorCQlpbnN0YWxsRWRpdFBvbGljeSgNCisJCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsDQorCQkJCW5ldyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsNCisJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLA0KKwkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkRSQUdfRFJPUF9ST0xFLA0KKwkJCQluZXcgRHJhZ0Ryb3BFZGl0UG9saWN5KCkpOw0KKwkJaW5zdGFsbEVkaXRQb2xpY3koDQorCQkJCUVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwNCisJCQkJbmV3IFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsNCisJCWlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5nZXRMYXlvdXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQpIHsNCisJCQlzdXBlci5zZXRSYXRpbyhyYXRpbyk7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL2NoYW5nZXMudHh0IGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL2NoYW5nZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGU3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvY2hhbmdlcy50eHQKQEAgLTAsMCArMSw0MyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK2NyZWF0ZU5vZGVTaGFwZSAocmVzdCkNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorTXVsdGlJbnB1dFBvcnRGaWd1cmUgZmlndXJlID0gbmV3IE11bHRpSW5wdXRQb3J0RmlndXJlKCk7DQorSW5wdXRQb3J0IHBvcnQgPSAoSW5wdXRQb3J0KSB0aGlzLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsNCitmaWd1cmUuc2V0UG9ydChwb3J0KTsNCityZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKw0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitjcmVhdGVOb2RlU2hhcGUgKGxhc3QpDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1NpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZmlndXJlID0gbmV3IFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUoKTsNCitSZWN0YW5nbGVGaWd1cmUgY29tcEhlbHBlciA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgxKTsNCitSZWN0YW5nbGVGaWd1cmUgY29tcFJlZiA9IChSZWN0YW5nbGVGaWd1cmUpIGZpZ3VyZS5nZXRDaGlsZHJlbigpLmdldCgyKTsNCitMYWJlbHMuc2V0TGFiZWxzKGNvbXBIZWxwZXIsIGNvbXBSZWYsIHRydWUpOw0KK1JlZmFjdG9yaW5nVW5pdCB1bml0ID0gKFJlZmFjdG9yaW5nVW5pdCkgdGhpcy5yZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7DQordW5pdC5zZXRGaWd1cmUoZmlndXJlKTsNCityZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOw0KKw0KKw0KKy0tLS0tLS0tLS0tLS0tLS0NCithZGRGaXhlZENoaWxkcmVuDQorLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKy0+IGJlaSBJbnB1dFBvcnRzDQorDQorUG9zaXRpb25Db25zdGFudHMuTk9SVEgpOw0KK2xvY2F0b3Iuc2V0Q3VycmVudFNpZGVPZlBhcmVudChQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCk7IC8vIFBvc2l0aW9uIGRlcyBQb3J0cw0KK2xvY2F0b3Iuc2V0UHJlZmVycmVkU2lkZU9mUGFyZW50KFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKTsgLy8gUG9zaXRpb24gZGVzIFBvcnRzDQorDQorDQorLS0tLS0tLS0tLS0tLS0tLQ0KK3JlbW92ZUZpeGVkQ2hpbGQNCistLS0tLS0tLS0tLS0tLS0tDQorDQorLT4gYmVpIE1VTFRJLUlucHV0UG9ydHMNCisNCitrb21wbGV0dCBhdXNrb21tZW50aWVyZW4NCisNCisNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcGFydHMvY3VzdG9tL0xhYmVscy5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL2N1c3RvbS9MYWJlbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWRmNTMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BhcnRzL2N1c3RvbS9MYWJlbHMuamF2YQpAQCAtMCwwICsxLDQ2IEBACitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuY3VzdG9tOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247DQorDQorLyoqDQorICogU2VsYnN0ZGVmaW5pZXJ0ZSBMYWJlbHMNCisgKiBAYXV0aG9yIEdlcnJpdA0KKyAqDQorICovDQorcHVibGljIGNsYXNzIExhYmVscyB7DQorDQorCXB1YmxpYyBzdGF0aWMgTGFiZWwgZ2V0SGVscGVyTGFiZWwoKXsNCisJCUxhYmVsIGwgPSBuZXcgTGFiZWwoKTsNCisJCWwuc2V0VGV4dCgiSGVscGVyIFVuaXRzIik7DQorCQlyZXR1cm4gbDsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBMYWJlbCBnZXRSZWZhY3RvcmluZ1VuaXRMYWJlbChib29sZWFuIHNpbmd1bGFyKXsNCisJCVN0cmluZyB0ZXh0ID0gIlJlZmFjdG9yaW5nIFVuaXQiOw0KKwkJaWYoIXNpbmd1bGFyKSB7DQorCQkJdGV4dCArPSAicyI7DQorCQl9DQorCQlMYWJlbCBsID0gbmV3IExhYmVsKCk7DQorCQlsLnNldFRleHQodGV4dCk7DQorCQlyZXR1cm4gbDsNCisJfQ0KKwkNCisJDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYWJlbHMoUmVjdGFuZ2xlRmlndXJlIGNvbXBIZWxwZXIsIFJlY3RhbmdsZUZpZ3VyZSBjb21wUmVmLGJvb2xlYW4gc2luZ3VsYXIpIHsNCisJCURpbWVuc2lvbiBtYXhpbXVtU2l6ZSA9IG5ldyBEaW1lbnNpb24oKTsNCisJCW1heGltdW1TaXplLmhlaWdodCA9IDE1Ow0KKwkJbWF4aW11bVNpemUud2lkdGggPSBjb21wSGVscGVyLmdldE1heGltdW1TaXplKCkud2lkdGg7DQorDQorCQlMYWJlbCBoZWxwZXJMYWJlbCA9IGdldEhlbHBlckxhYmVsKCk7DQorCQloZWxwZXJMYWJlbC5zZXRNYXhpbXVtU2l6ZShtYXhpbXVtU2l6ZSk7DQorCQljb21wSGVscGVyLmFkZChoZWxwZXJMYWJlbCk7DQorCQljb21wSGVscGVyLnNldFRvb2xUaXAoZ2V0SGVscGVyTGFiZWwoKSk7DQorCQlMYWJlbCByZWZMYWJlbCA9IGdldFJlZmFjdG9yaW5nVW5pdExhYmVsKHNpbmd1bGFyKTsNCisJCXJlZkxhYmVsLnNldE1heGltdW1TaXplKG1heGltdW1TaXplKTsNCisNCisJCWNvbXBSZWYuYWRkKHJlZkxhYmVsKTsNCisJCWNvbXBSZWYuc2V0VG9vbFRpcChnZXRSZWZhY3RvcmluZ1VuaXRMYWJlbChzaW5ndWxhcikpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmUxMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0QXRvbWljVW5pdF8zMDM0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEID09IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFZpc3VhbElEKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldEF0b21pY1VuaXRfMzAzNFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYjNkNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzAzNCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1Y2Q3ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X0lucHV0UG9ydHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldEF0b21pY1VuaXRfMzA0OVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRBdG9taWNVbml0XzMwNDlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGZjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNDkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjg5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRBdG9taWNVbml0XzMwNjhTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQgPT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VmlzdWFsSUQodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0QXRvbWljVW5pdF8zMDY4U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTMxZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc1M2UxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0QXRvbWljVW5pdF8zMDc0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEID09IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFZpc3VhbElEKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldEF0b21pY1VuaXRfMzA3NFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZGMwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhNzc2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X0lucHV0UG9ydHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldEF0b21pY1VuaXRfMzA3N1NlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRBdG9taWNVbml0XzMwNzdTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjhmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzM5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQXRvbWljVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdG9taWNVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRBdG9taWNVbml0XzMwNzhTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQgPT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VmlzdWFsSUQodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0QXRvbWljVW5pdF8zMDc4U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc4Mzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBdG9taWNVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc4KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMzJiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRBdG9taWNVbml0XzIwMDdTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQgPT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VmlzdWFsSUQodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0QXRvbWljVW5pdF8yMDA3U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0F0b21pY1VuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwMWYzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9BdG9taWNVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMjAwNyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDlDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwMTFlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzDQorCQlDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDAzU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDNTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjg4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzNDE1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzDQorCQlDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDdTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZWYzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3YWM2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzDQorCQlDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjVTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzZiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwOWNhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzDQorCQlDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI5U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzQ4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwZDlhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzDQorCQlDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDMzU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzNTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmQ0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5ZDg0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzDQorCQlDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDdTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNWI2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWQ1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0cygpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMlNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8yMDAyU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkMjhkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDAzU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDNTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODMxMzRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMDggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMTIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwMTkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RiZTkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDdTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAwN1NlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWZmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAxMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMGNmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAxMVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJc3dpdGNoICh2aXN1YWxJRCkgew0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDExU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhNTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDA4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwMTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwYzQyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDE1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMTVTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJjYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMDggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMTIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwMTkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzAzMWUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjFTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAyMVNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjlhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAxMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODlhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAzOVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJc3dpdGNoICh2aXN1YWxJRCkgew0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDM5U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmMjc3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDA4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwMTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDA5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDFTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAwMVNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQyMTUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMDggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMTIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwMTkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMDgyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDA0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMDRTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmMyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmNiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDA4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMDhTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDhhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjM2E5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDEyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMTJTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMWU1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Y2YyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDE2U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMTZTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmEyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWIyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDIyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMjJTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ODk0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDdlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDQwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNDBTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDVlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM4MTZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMDJTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAwMlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODJiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ2FydGVzaWFuUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc5Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NhcnRlc2lhblF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29tcG9zaXRlUmVmYWN0b3JpbmdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29tcG9zaXRlUmVmYWN0b3JpbmdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NGQ3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db21wb3NpdGVSZWZhY3RvcmluZ0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE0MDIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uQ2hlY2tFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZU91dHB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxMaW5rRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUmVmYWN0b3JpbmdDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZXQgZ2V0RmVhdHVyZXNUb1N5bmNocm9uaXplKCkgew0KKwkJaWYgKG15RmVhdHVyZXNUb1N5bmNocm9uaXplID09IG51bGwpIHsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNb2RlbFJlZmFjdG9yaW5nX0lucHV0UG9ydHMoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfTWFpblJlZmFjdG9yaW5nVW5pdCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDBTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiBDb21yZWxEaWFncmFtVXBkYXRlci5pc1Nob3J0Y3V0T3JwaGFuZWQodmlldyk7DQorCQl9DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDBTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJCWlmICh2LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwgJiYgQ29tcmVsRGlhZ3JhbVVwZGF0ZXIuaXNTaG9ydGN1dE9ycGhhbmVkKHYpKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJb3JwaGFuZWQuYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorDQorCQlDb2xsZWN0aW9uPElBZGFwdGFibGU+IGNyZWF0ZWRDb25uZWN0aW9uVmlld3MgPSByZWZyZXNoQ29ubmVjdGlvbnMoKTsNCisNCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJY3JlYXRlZFZpZXdzLmFkZEFsbChjcmVhdGVkQ29ubmVjdGlvblZpZXdzKTsNCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb248SUFkYXB0YWJsZT4gcmVmcmVzaENvbm5lY3Rpb25zKCkgew0KKwkJTWFwPEVPYmplY3QsIFZpZXc+IGRvbWFpbjJOb3RhdGlvbk1hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIFZpZXc+KCk7DQorCQlDb2xsZWN0aW9uPENvbXJlbExpbmtEZXNjcmlwdG9yPiBsaW5rRGVzY3JpcHRvcnMgPSBjb2xsZWN0QWxsTGlua3MoDQorCQkJCWdldERpYWdyYW0oKSwgZG9tYWluMk5vdGF0aW9uTWFwKTsNCisJCUNvbGxlY3Rpb24gZXhpc3RpbmdMaW5rcyA9IG5ldyBMaW5rZWRMaXN0KGdldERpYWdyYW0oKS5nZXRFZGdlcygpKTsNCisJCWZvciAoSXRlcmF0b3IgbGlua3NJdGVyYXRvciA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgbGlua3NJdGVyYXRvcg0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2UgbmV4dERpYWdyYW1MaW5rID0gKEVkZ2UpIGxpbmtzSXRlcmF0b3IubmV4dCgpOw0KKwkJCWludCBkaWFncmFtTGlua1Zpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJLmdldFZpc3VhbElEKG5leHREaWFncmFtTGluayk7DQorCQkJaWYgKGRpYWdyYW1MaW5rVmlzdWFsSUQgPT0gLTEpIHsNCisJCQkJaWYgKG5leHREaWFncmFtTGluay5nZXRTb3VyY2UoKSAhPSBudWxsDQorCQkJCQkJJiYgbmV4dERpYWdyYW1MaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsNCisJCQkJCWxpbmtzSXRlcmF0b3IucmVtb3ZlKCk7DQorCQkJCX0NCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCUVPYmplY3QgZGlhZ3JhbUxpbmtPYmplY3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0RWxlbWVudCgpOw0KKwkJCUVPYmplY3QgZGlhZ3JhbUxpbmtTcmMgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0U291cmNlKCkuZ2V0RWxlbWVudCgpOw0KKwkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkuZ2V0RWxlbWVudCgpOw0KKwkJCWZvciAoSXRlcmF0b3I8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzDQorCQkJCQkuaXRlcmF0b3IoKTsgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCQlDb21yZWxMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcg0KKwkJCQkJCS5uZXh0KCk7DQorCQkJCWlmIChkaWFncmFtTGlua09iamVjdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IuZ2V0TW9kZWxFbGVtZW50KCkNCisJCQkJCQkmJiBkaWFncmFtTGlua1NyYyA9PSBuZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U291cmNlKCkNCisJCQkJCQkmJiBkaWFncmFtTGlua0RzdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3INCisJCQkJCQkJCS5nZXREZXN0aW5hdGlvbigpDQorCQkJCQkJJiYgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9PSBuZXh0TGlua0Rlc2NyaXB0b3INCisJCQkJCQkJCS5nZXRWaXN1YWxJRCgpKSB7DQorCQkJCQlsaW5rc0l0ZXJhdG9yLnJlbW92ZSgpOw0KKwkJCQkJbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWRlbGV0ZVZpZXdzKGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKSk7DQorCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbnMobGlua0Rlc2NyaXB0b3JzLCBkb21haW4yTm90YXRpb25NYXApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb248Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGNvbGxlY3RBbGxMaW5rcyhWaWV3IHZpZXcsDQorCQkJTWFwPEVPYmplY3QsIFZpZXc+IGRvbWFpbjJOb3RhdGlvbk1hcCkgew0KKwkJaWYgKCFDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lEDQorCQkJCS5lcXVhbHMoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKSB7DQorCQljYXNlIENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUlucHV0UG9ydF8yMDAxQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfMjAwNENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNlcXVlbnRpYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMjAwNUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldENvbmRpdGlvbmFsVW5pdF8yMDA2Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgQXRvbWljVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldEF0b21pY1VuaXRfMjAwN0NvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVJbnB1dFBvcnRfMzAwMUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlJbnB1dFBvcnRfMzAwMkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDAzQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUlucHV0UG9ydF8zMDA1Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlJbnB1dFBvcnRfMzAwNkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDA4Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUlucHV0UG9ydF8zMDA5Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlJbnB1dFBvcnRfMzAxMENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVPdXRwdXRQb3J0XzMwMTFDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDEyQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUlucHV0UG9ydF8zMDEzQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlJbnB1dFBvcnRfMzAxNENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpT3V0cHV0UG9ydF8zMDE1Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUZpbHRlclVuaXRfMzAxNkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpSW5wdXRQb3J0XzMwMTdDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZU91dHB1dFBvcnRfMzAxOENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpRmlsdGVyVW5pdF8zMDE5Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlJbnB1dFBvcnRfMzAyMENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRNdWx0aU91dHB1dFBvcnRfMzAyMUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDIyQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUlucHV0UG9ydF8zMDIzQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlJbnB1dFBvcnRfMzAyNENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI1Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMzAyNkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVJbnB1dFBvcnRfMzAyN0NvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpSW5wdXRQb3J0XzMwMjhDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzAzMENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVJbnB1dFBvcnRfMzAzMUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpSW5wdXRQb3J0XzMwMzJDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAzM0NvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0QXRvbWljVW5pdF8zMDM0Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUlucHV0UG9ydF8zMDM1Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM2Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzAzOENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDM5Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVGaWx0ZXJVbml0XzMwNDBDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNDFDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfMzA0MkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M0NvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNlcXVlbnRpYWxVbml0XzMwNDRDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDVDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0XzMwNDZDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0N0NvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0QXRvbWljVW5pdF8zMDQ5Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA1MENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDUxQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNTNDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfMzA1NENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0XzMwNTVDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfMzA1NkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDU3Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpRmlsdGVyVW5pdF8zMDU4Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTlDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdF8zMDYwQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA2MUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDYyQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTaW5nbGVGaWx0ZXJVbml0XzMwNjNDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2NUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA2NkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRBdG9taWNVbml0XzMwNjhDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRTZXF1ZW50aWFsVW5pdF8zMDY5Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMzA3MENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA3MUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA3MkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNlcXVlbnRpYWxVbml0XzMwNzNDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldEF0b21pY1VuaXRfMzA3NENvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA3NUNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0Q29uZGl0aW9uQ2hlY2tfMzA3NkNvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0QXRvbWljVW5pdF8zMDc3Q29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJcmVzdWx0LmFkZEFsbChDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkJCS5nZXRBdG9taWNVbml0XzMwNzhDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldFNpbmdsZVBvcnRNYXBwaW5nXzQwMDFDb250YWluZWRMaW5rcyh2aWV3KSk7DQorCQkJfQ0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKQ0KKwkJCQkJfHwgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJZG9tYWluMk5vdGF0aW9uTWFwLnB1dCh2aWV3LmdldEVsZW1lbnQoKSwgdmlldyk7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJY2FzZSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpKSB7DQorCQkJCXJlc3VsdC5hZGRBbGwoQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJCQkuZ2V0TXVsdGlQb3J0TWFwcGluZ180MDAyQ29udGFpbmVkTGlua3ModmlldykpOw0KKwkJCX0NCisJCQlpZiAoIWRvbWFpbjJOb3RhdGlvbk1hcC5jb250YWluc0tleSh2aWV3LmdldEVsZW1lbnQoKSkNCisJCQkJCXx8IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQorCQkJCWRvbWFpbjJOb3RhdGlvbk1hcC5wdXQodmlldy5nZXRFbGVtZW50KCksIHZpZXcpOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCWlmICghZG9tYWluMk5vdGF0aW9uTWFwLmNvbnRhaW5zS2V5KHZpZXcuZ2V0RWxlbWVudCgpKSkgew0KKwkJCQlyZXN1bHQuYWRkQWxsKENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCQkJLmdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwM0NvbnRhaW5lZExpbmtzKHZpZXcpKTsNCisJCQl9DQorCQkJaWYgKCFkb21haW4yTm90YXRpb25NYXAuY29udGFpbnNLZXkodmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQl8fCB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQlkb21haW4yTm90YXRpb25NYXAucHV0KHZpZXcuZ2V0RWxlbWVudCgpLCB2aWV3KTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yIGNoaWxkcmVuID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNoaWxkcmVuDQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJcmVzdWx0LmFkZEFsbChjb2xsZWN0QWxsTGlua3MoKFZpZXcpIGNoaWxkcmVuLm5leHQoKSwNCisJCQkJCWRvbWFpbjJOb3RhdGlvbk1hcCkpOw0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvciBlZGdlcyA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBlZGdlcy5oYXNOZXh0KCk7KSB7DQorCQkJcmVzdWx0LmFkZEFsbChjb2xsZWN0QWxsTGlua3MoKFZpZXcpIGVkZ2VzLm5leHQoKSwNCisJCQkJCWRvbWFpbjJOb3RhdGlvbk1hcCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBDb2xsZWN0aW9uPElBZGFwdGFibGU+IGNyZWF0ZUNvbm5lY3Rpb25zKA0KKwkJCUNvbGxlY3Rpb248Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGxpbmtEZXNjcmlwdG9ycywNCisJCQlNYXA8RU9iamVjdCwgVmlldz4gZG9tYWluMk5vdGF0aW9uTWFwKSB7DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGFkYXB0ZXJzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCWZvciAoQ29tcmVsTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yIDogbGlua0Rlc2NyaXB0b3JzKSB7DQorCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSBnZXRFZGl0UGFydCgNCisJCQkJCW5leHRMaW5rRGVzY3JpcHRvci5nZXRTb3VyY2UoKSwgZG9tYWluMk5vdGF0aW9uTWFwKTsNCisJCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0KA0KKwkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldERlc3RpbmF0aW9uKCksIGRvbWFpbjJOb3RhdGlvbk1hcCk7DQorCQkJaWYgKHNvdXJjZUVkaXRQYXJ0ID09IG51bGwgfHwgdGFyZ2V0RWRpdFBhcnQgPT0gbnVsbCkgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IoDQorCQkJCQluZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U2VtYW50aWNBZGFwdGVyKCksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dExpbmtEZXNjcmlwdG9yDQorCQkJCQkJCS5nZXRWaXN1YWxJRCgpKSwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCSgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpDQorCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCBjY3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0KA0KKwkJCQkJZGVzY3JpcHRvcik7DQorCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7DQorCQkJY2NyLnNldFNvdXJjZUVkaXRQYXJ0KHNvdXJjZUVkaXRQYXJ0KTsNCisJCQlzb3VyY2VFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7DQorCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsNCisJCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORCk7DQorCQkJQ29tbWFuZCBjbWQgPSB0YXJnZXRFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7DQorCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQkJSUFkYXB0YWJsZSB2aWV3QWRhcHRlciA9IChJQWRhcHRhYmxlKSBjY3IuZ2V0TmV3T2JqZWN0KCk7DQorCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7DQorCQkJCQlhZGFwdGVycy5hZGQodmlld0FkYXB0ZXIpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGFkYXB0ZXJzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVkaXRQYXJ0IGdldEVkaXRQYXJ0KEVPYmplY3QgZG9tYWluTW9kZWxFbGVtZW50LA0KKwkJCU1hcDxFT2JqZWN0LCBWaWV3PiBkb21haW4yTm90YXRpb25NYXApIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBkb21haW4yTm90YXRpb25NYXAuZ2V0KGRvbWFpbk1vZGVsRWxlbWVudCk7DQorCQlpZiAodmlldyAhPSBudWxsKSB7DQorCQkJcmV0dXJuIChFZGl0UGFydCkgZ2V0SG9zdCgpLmdldFZpZXdlcigpLmdldEVkaXRQYXJ0UmVnaXN0cnkoKQ0KKwkJCQkJLmdldCh2aWV3KTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsNCisJCXJldHVybiAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXREaWFncmFtKCk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbXBvc2l0ZVJlZmFjdG9yaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbXBvc2l0ZVJlZmFjdG9yaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkN2VkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZHMuRHVwbGljYXRlRU9iamVjdHNDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21wb3NpdGVSZWZhY3RvcmluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXBvc2l0ZVJlZmFjdG9yaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db21wb3NpdGVSZWZhY3RvcmluZ18xMDAwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8yMDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMjAwMyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzIwMDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzIwMDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMjAwNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzIwMDcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsNCisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQ0KKwkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOw0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZChlZGl0aW5nRG9tYWluLCByZXEpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kIGV4dGVuZHMNCisJCQlEdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoDQorCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sDQorCQkJCUR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsNCisJCQlzdXBlcihlZGl0aW5nRG9tYWluLCByZXEuZ2V0TGFiZWwoKSwgcmVxDQorCQkJCQkuZ2V0RWxlbWVudHNUb0JlRHVwbGljYXRlZCgpLCByZXENCisJCQkJCS5nZXRBbGxEdXBsaWNhdGVkRWxlbWVudHNNYXAoKSk7DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRlNWJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw2MDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlNlbWFudGljRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ29uZmlndXJlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuR2V0RWRpdENvbnRleHRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aVBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLk91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5Qb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLlF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuaGVscGVycy5Db21yZWxCYXNlRWRpdEhlbHBlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZXhwcmVzc2lvbnMuQ29tcmVsT0NMRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzIFNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBFeHRlbmRlZCByZXF1ZXN0IGRhdGEga2V5IHRvIGhvbGQgZWRpdHBhcnQgdmlzdWFsIGlkLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNVQUxfSURfS0VZID0gInZpc3VhbF9pZCI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgSUVsZW1lbnRUeXBlIG15RWxlbWVudFR5cGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7DQorCQlteUVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7DQorCX0NCisNCisJLyoqDQorCSAqIEV4dGVuZGVkIHJlcXVlc3QgZGF0YSBrZXkgdG8gaG9sZCBlZGl0cGFydCB2aXN1YWwgaWQuDQorCSAqIEFkZCB2aXN1YWwgaWQgb2YgZWRpdGVkIGVkaXRwYXJ0IHRvIGV4dGVuZGVkIGRhdGEgb2YgdGhlIHJlcXVlc3QNCisJICogc28gY29tbWFuZCBzd2l0Y2ggY2FuIGRlY2lkZSB3aGF0IGtpbmQgb2YgZGlhZ3JhbSBlbGVtZW50IGlzIGJlaW5nIGVkaXRlZC4NCisJICogSXQgaXMgZG9uZSBpbiB0aG9zZSBjYXNlcyB3aGVuIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRlZHVjZSBkaWFncmFtDQorCSAqIGVsZW1lbnQga2luZCBmcm9tIGRvbWFpbiBlbGVtZW50Lg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVjb25uZWN0UmVxdWVzdCkgew0KKwkJCU9iamVjdCB2aWV3ID0gKChSZWNvbm5lY3RSZXF1ZXN0KSByZXF1ZXN0KS5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQ0KKwkJCQkJLmdldE1vZGVsKCk7DQorCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcigNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKChWaWV3KSB2aWV3KSk7DQorCQkJCXJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkucHV0KFZJU1VBTF9JRF9LRVksIGlkKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB2aXN1YWwgaWQgZnJvbSByZXF1ZXN0IHBhcmFtZXRlcnMuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlPYmplY3QgaWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihWSVNVQUxfSURfS0VZKTsNCisJCXJldHVybiBpZCBpbnN0YW5jZW9mIEludGVnZXIgPyAoKEludGVnZXIpIGlkKS5pbnRWYWx1ZSgpIDogLTE7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsNCisJCUlFZGl0Q29tbWFuZFJlcXVlc3QgY29tcGxldGVkUmVxdWVzdCA9IGNvbXBsZXRlUmVxdWVzdChyZXF1ZXN0KTsNCisJCUNvbW1hbmQgc2VtYW50aWNDb21tYW5kID0gZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKGNvbXBsZXRlZFJlcXVlc3QpOw0KKwkJc2VtYW50aWNDb21tYW5kID0gZ2V0RWRpdEhlbHBlckNvbW1hbmQoY29tcGxldGVkUmVxdWVzdCwNCisJCQkJc2VtYW50aWNDb21tYW5kKTsNCisJCWlmIChjb21wbGV0ZWRSZXF1ZXN0IGluc3RhbmNlb2YgRGVzdHJveVJlcXVlc3QpIHsNCisJCQlEZXN0cm95UmVxdWVzdCBkZXN0cm95UmVxdWVzdCA9IChEZXN0cm95UmVxdWVzdCkgY29tcGxldGVkUmVxdWVzdDsNCisJCQlyZXR1cm4gc2hvdWxkUHJvY2VlZChkZXN0cm95UmVxdWVzdCkgPyBhZGREZWxldGVWaWV3Q29tbWFuZCgNCisJCQkJCXNlbWFudGljQ29tbWFuZCwgZGVzdHJveVJlcXVlc3QpIDogbnVsbDsNCisJCX0NCisJCXJldHVybiBzZW1hbnRpY0NvbW1hbmQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGFkZERlbGV0ZVZpZXdDb21tYW5kKENvbW1hbmQgbWFpbkNvbW1hbmQsDQorCQkJRGVzdHJveVJlcXVlc3QgY29tcGxldGVkUmVxdWVzdCkgew0KKwkJQ29tbWFuZCBkZWxldGVWaWV3Q29tbWFuZCA9IGdldEdFRldyYXBwZXIobmV3IERlbGV0ZUNvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKSk7DQorCQlyZXR1cm4gbWFpbkNvbW1hbmQgPT0gbnVsbCA/IGRlbGV0ZVZpZXdDb21tYW5kIDogbWFpbkNvbW1hbmQNCisJCQkJLmNoYWluKGRlbGV0ZVZpZXdDb21tYW5kKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBDb21tYW5kIGdldEVkaXRIZWxwZXJDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCwNCisJCQlDb21tYW5kIGVkaXRQb2xpY3lDb21tYW5kKSB7DQorCQlpZiAoZWRpdFBvbGljeUNvbW1hbmQgIT0gbnVsbCkgew0KKwkJCUlDb21tYW5kIGNvbW1hbmQgPSBlZGl0UG9saWN5Q29tbWFuZCBpbnN0YW5jZW9mIElDb21tYW5kUHJveHkgPyAoKElDb21tYW5kUHJveHkpIGVkaXRQb2xpY3lDb21tYW5kKQ0KKwkJCQkJLmdldElDb21tYW5kKCkgOiBuZXcgQ29tbWFuZFByb3h5KGVkaXRQb2xpY3lDb21tYW5kKTsNCisJCQlyZXF1ZXN0LnNldFBhcmFtZXRlcihDb21yZWxCYXNlRWRpdEhlbHBlci5FRElUX1BPTElDWV9DT01NQU5ELA0KKwkJCQkJY29tbWFuZCk7DQorCQl9DQorCQlJRWxlbWVudFR5cGUgcmVxdWVzdENvbnRleHRFbGVtZW50VHlwZSA9IGdldENvbnRleHRFbGVtZW50VHlwZShyZXF1ZXN0KTsNCisJCXJlcXVlc3Quc2V0UGFyYW1ldGVyKENvbXJlbEJhc2VFZGl0SGVscGVyLkNPTlRFWFRfRUxFTUVOVF9UWVBFLA0KKwkJCQlyZXF1ZXN0Q29udGV4dEVsZW1lbnRUeXBlKTsNCisJCUlDb21tYW5kIGNvbW1hbmQgPSByZXF1ZXN0Q29udGV4dEVsZW1lbnRUeXBlLmdldEVkaXRDb21tYW5kKHJlcXVlc3QpOw0KKwkJcmVxdWVzdC5zZXRQYXJhbWV0ZXIoQ29tcmVsQmFzZUVkaXRIZWxwZXIuRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7DQorCQlyZXF1ZXN0LnNldFBhcmFtZXRlcihDb21yZWxCYXNlRWRpdEhlbHBlci5DT05URVhUX0VMRU1FTlRfVFlQRSwgbnVsbCk7DQorCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7DQorCQkJaWYgKCEoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKSkgew0KKwkJCQljb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQljb21tYW5kLmdldExhYmVsKCkpLmNvbXBvc2UoY29tbWFuZCk7DQorCQkJfQ0KKwkJCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjb21tYW5kKTsNCisJCX0NCisJCXJldHVybiBlZGl0UG9saWN5Q29tbWFuZDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJRWxlbWVudFR5cGUgZ2V0Q29udGV4dEVsZW1lbnRUeXBlKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJSUVsZW1lbnRUeXBlIHJlcXVlc3RDb250ZXh0RWxlbWVudFR5cGUgPSBDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEVsZW1lbnRUeXBlKGdldFZpc3VhbElEKHJlcXVlc3QpKTsNCisJCXJldHVybiByZXF1ZXN0Q29udGV4dEVsZW1lbnRUeXBlICE9IG51bGwgPyByZXF1ZXN0Q29udGV4dEVsZW1lbnRUeXBlDQorCQkJCTogbXlFbGVtZW50VHlwZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7DQorCQlpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgew0KKwkJCXJldHVybiBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOw0KKwkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVFbGVtZW50UmVxdWVzdCkgew0KKwkJCXJldHVybiBnZXRDcmVhdGVDb21tYW5kKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgcmVxKTsNCisJCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ29uZmlndXJlUmVxdWVzdCkgew0KKwkJCXJldHVybiBnZXRDb25maWd1cmVDb21tYW5kKChDb25maWd1cmVSZXF1ZXN0KSByZXEpOw0KKwkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95RWxlbWVudFJlcXVlc3QpIHsNCisJCQlyZXR1cm4gZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChEZXN0cm95RWxlbWVudFJlcXVlc3QpIHJlcSk7DQorCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSB7DQorCQkJcmV0dXJuIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgcmVxKTsNCisJCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0KSB7DQorCQkJcmV0dXJuIGdldER1cGxpY2F0ZUNvbW1hbmQoKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgcmVxKTsNCisJCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgR2V0RWRpdENvbnRleHRSZXF1ZXN0KSB7DQorCQkJcmV0dXJuIGdldEVkaXRDb250ZXh0Q29tbWFuZCgoR2V0RWRpdENvbnRleHRSZXF1ZXN0KSByZXEpOw0KKwkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBNb3ZlUmVxdWVzdCkgew0KKwkJCXJldHVybiBnZXRNb3ZlQ29tbWFuZCgoTW92ZVJlcXVlc3QpIHJlcSk7DQorCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgew0KKwkJCXJldHVybiBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsNCisJCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7DQorCQkJcmV0dXJuIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSByZXEpOw0KKwkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBTZXRSZXF1ZXN0KSB7DQorCQkJcmV0dXJuIGdldFNldENvbW1hbmQoKFNldFJlcXVlc3QpIHJlcSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29uZmlndXJlQ29tbWFuZChDb25maWd1cmVSZXF1ZXN0IHJlcSkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFNldENvbW1hbmQoU2V0UmVxdWVzdCByZXEpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRFZGl0Q29udGV4dENvbW1hbmQoR2V0RWRpdENvbnRleHRSZXF1ZXN0IHJlcSkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoTW92ZVJlcXVlc3QgcmVxKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGdldEdFRldyYXBwZXIoSUNvbW1hbmQgY21kKSB7DQorCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY21kKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBlZGl0aW5nIGRvbWFpbiBmcm9tIHRoZSBob3N0IGVkaXQgcGFydC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7DQorCQlyZXR1cm4gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkuZ2V0RWRpdGluZ0RvbWFpbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDbGVhbiBhbGwgc2hvcnRjdXRzIHRvIHRoZSBob3N0IGVsZW1lbnQgZnJvbSB0aGUgc2FtZSBkaWFncmFtDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCwgVmlldyB2aWV3KSB7DQorCQlhc3NlcnQgdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsOyAvLyROT04tTkxTLTEkDQorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVZpZXcgbmV4dFZpZXcgPSAoVmlldykgaXQubmV4dCgpOw0KKwkJCWlmIChuZXh0Vmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSA9PSBudWxsIHx8ICFuZXh0Vmlldy5pc1NldEVsZW1lbnQoKSB8fCBuZXh0Vmlldy5nZXRFbGVtZW50KCkgIT0gdmlldy5nZXRFbGVtZW50KCkpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5leHRWaWV3KSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlua0NvbnN0cmFpbnRzIGdldExpbmtDb25zdHJhaW50cygpIHsNCisJCUxpbmtDb25zdHJhaW50cyBjYWNoZWQgPSBDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkNCisJCQkJLmdldExpbmtDb25zdHJhaW50cygpOw0KKwkJaWYgKGNhY2hlZCA9PSBudWxsKSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNldExpbmtDb25zdHJhaW50cygNCisJCQkJCWNhY2hlZCA9IG5ldyBMaW5rQ29uc3RyYWludHMoKSk7DQorCQl9DQorCQlyZXR1cm4gY2FjaGVkOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIExpbmtDb25zdHJhaW50cyB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJTGlua0NvbnN0cmFpbnRzKCkgew0KKwkJCS8vIHVzZSBzdGF0aWMgbWV0aG9kICNnZXRMaW5rQ29uc3RyYWludHMoKSB0byBhY2Nlc3MgaW5zdGFuY2UNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgYm9vbGVhbiBjYW5DcmVhdGVTaW5nbGVQb3J0TWFwcGluZ180MDAxKA0KKwkJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIsIFNpbmdsZVBvcnQgc291cmNlLA0KKwkJCQlTaW5nbGVJbnB1dFBvcnQgdGFyZ2V0KSB7DQorCQkJcmV0dXJuIGNhbkV4aXN0U2luZ2xlUG9ydE1hcHBpbmdfNDAwMShjb250YWluZXIsIG51bGwsIHNvdXJjZSwNCisJCQkJCXRhcmdldCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlTXVsdGlQb3J0TWFwcGluZ180MDAyKA0KKwkJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIsIE11bHRpUG9ydCBzb3VyY2UsDQorCQkJCU11bHRpSW5wdXRQb3J0IHRhcmdldCkgew0KKwkJCXJldHVybiBjYW5FeGlzdE11bHRpUG9ydE1hcHBpbmdfNDAwMihjb250YWluZXIsIG51bGwsIHNvdXJjZSwNCisJCQkJCXRhcmdldCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKA0KKwkJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIsIE11bHRpUG9ydCBzb3VyY2UsDQorCQkJCVNpbmdsZUlucHV0UG9ydCB0YXJnZXQpIHsNCisJCQlyZXR1cm4gY2FuRXhpc3RNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMoY29udGFpbmVyLCBudWxsLCBzb3VyY2UsDQorCQkJCQl0YXJnZXQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkJICovDQorCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGlzdFNpbmdsZVBvcnRNYXBwaW5nXzQwMDEoDQorCQkJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciwgU2luZ2xlUG9ydE1hcHBpbmcgbGlua0luc3RhbmNlLA0KKwkJCQlTaW5nbGVQb3J0IHNvdXJjZSwgU2luZ2xlSW5wdXRQb3J0IHRhcmdldCkgew0KKwkJCXRyeSB7DQorCQkJCWlmIChzb3VyY2UgPT0gbnVsbCkgew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0gZWxzZSBpZiAoIXNpbmdsZVBvcnRNYXBwaW5nUnVsZXMoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJfQ0KKw0KKwkJCQllbHNlIHsNCisJCQkJCU1hcDxTdHJpbmcsIEVDbGFzc2lmaWVyPiBlbnYgPSBDb2xsZWN0aW9ucw0KKwkJCQkJCQkuPFN0cmluZywgRUNsYXNzaWZpZXI+IHNpbmdsZXRvbk1hcCgNCisJCQkJCQkJCQkib3Bwb3NpdGVFbmQiLCBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCU9iamVjdCBzb3VyY2VWYWwgPSBDb21yZWxPQ0xGYWN0b3J5LmdldEV4cHJlc3Npb24oMCwNCisJCQkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUG9ydCgpLCBlbnYpDQorCQkJCQkJCS5ldmFsdWF0ZSgNCisJCQkJCQkJCQlzb3VyY2UsDQorCQkJCQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKA0KKwkJCQkJCQkJCQkJIm9wcG9zaXRlRW5kIiwgdGFyZ2V0KSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCWlmIChmYWxzZSA9PSBzb3VyY2VWYWwgaW5zdGFuY2VvZiBCb29sZWFuDQorCQkJCQkJCXx8ICEoKEJvb2xlYW4pIHNvdXJjZVZhbCkuYm9vbGVhblZhbHVlKCkpIHsNCisJCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCQl9IC8vIGVsc2UgZmFsbC10aHJvdWdoDQorCQkJCX0NCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJCSJMaW5rIGNvbnN0cmFpbnQgZXZhbHVhdGlvbiBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkDQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQgTk9UDQorCQkgKi8NCisJCXB1YmxpYyBib29sZWFuIGNhbkV4aXN0TXVsdGlQb3J0TWFwcGluZ180MDAyKA0KKwkJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIsIE11bHRpUG9ydE1hcHBpbmcgbGlua0luc3RhbmNlLA0KKwkJCQlNdWx0aVBvcnQgc291cmNlLCBNdWx0aUlucHV0UG9ydCB0YXJnZXQpIHsNCisJCQl0cnkgew0KKwkJCQlpZiAoc291cmNlID09IG51bGwpIHsNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQl9IGVsc2UgaWYgKCFtdWx0aVBvcnRNYXBwaW5nUnVsZXMoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJfQ0KKw0KKwkJCQllbHNlIHsNCisJCQkJCU1hcDxTdHJpbmcsIEVDbGFzc2lmaWVyPiBlbnYgPSBDb2xsZWN0aW9ucw0KKwkJCQkJCQkuPFN0cmluZywgRUNsYXNzaWZpZXI+IHNpbmdsZXRvbk1hcCgNCisJCQkJCQkJCQkib3Bwb3NpdGVFbmQiLCBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQkJT2JqZWN0IHNvdXJjZVZhbCA9IENvbXJlbE9DTEZhY3RvcnkuZ2V0RXhwcmVzc2lvbigxLA0KKwkJCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aVBvcnQoKSwgZW52KQ0KKwkJCQkJCQkuZXZhbHVhdGUoDQorCQkJCQkJCQkJc291cmNlLA0KKwkJCQkJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgNCisJCQkJCQkJCQkJCSJvcHBvc2l0ZUVuZCIsIHRhcmdldCkpOyAvLyROT04tTkxTLTEkDQorCQkJCQlpZiAoZmFsc2UgPT0gc291cmNlVmFsIGluc3RhbmNlb2YgQm9vbGVhbg0KKwkJCQkJCQl8fCAhKChCb29sZWFuKSBzb3VyY2VWYWwpLmJvb2xlYW5WYWx1ZSgpKSB7DQorCQkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQkJfSAvLyBlbHNlIGZhbGwtdGhyb3VnaA0KKwkJCQl9DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCQkiTGluayBjb25zdHJhaW50IGV2YWx1YXRpb24gZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkJICovDQorCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGlzdE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMygNCisJCQkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyLA0KKwkJCQlNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIGxpbmtJbnN0YW5jZSwgTXVsdGlQb3J0IHNvdXJjZSwNCisJCQkJU2luZ2xlSW5wdXRQb3J0IHRhcmdldCkgew0KKwkJCXRyeSB7DQorCQkJCWlmIChzb3VyY2UgPT0gbnVsbCkgew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0gZWxzZSBpZiAoIW11bHRpU2luZ2xlUG9ydE1hcHBpbmdSdWxlcyhjb250YWluZXIsIHNvdXJjZSwNCisJCQkJCQl0YXJnZXQpKSB7DQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCX0NCisNCisJCQkJZWxzZSB7DQorCQkJCQlNYXA8U3RyaW5nLCBFQ2xhc3NpZmllcj4gZW52ID0gQ29sbGVjdGlvbnMNCisJCQkJCQkJLjxTdHJpbmcsIEVDbGFzc2lmaWVyPiBzaW5nbGV0b25NYXAoDQorCQkJCQkJCQkJIm9wcG9zaXRlRW5kIiwgQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkpOyAvLyROT04tTkxTLTEkDQorCQkJCQlPYmplY3Qgc291cmNlVmFsID0gQ29tcmVsT0NMRmFjdG9yeS5nZXRFeHByZXNzaW9uKDIsDQorCQkJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpUG9ydCgpLCBlbnYpDQorCQkJCQkJCS5ldmFsdWF0ZSgNCisJCQkJCQkJCQlzb3VyY2UsDQorCQkJCQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKA0KKwkJCQkJCQkJCQkJIm9wcG9zaXRlRW5kIiwgdGFyZ2V0KSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCWlmIChmYWxzZSA9PSBzb3VyY2VWYWwgaW5zdGFuY2VvZiBCb29sZWFuDQorCQkJCQkJCXx8ICEoKEJvb2xlYW4pIHNvdXJjZVZhbCkuYm9vbGVhblZhbHVlKCkpIHsNCisJCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCQl9IC8vIGVsc2UgZmFsbC10aHJvdWdoDQorCQkJCX0NCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJCSJMaW5rIGNvbnN0cmFpbnQgZXZhbHVhdGlvbiBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkDQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQl9DQorDQorCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNpbmdsZVBvcnRNYXBwaW5nUnVsZXMoDQorCQkJCWNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIsIGNvbXJlbC5Qb3J0IHNvdXJjZSwNCisJCQkJY29tcmVsLklucHV0UG9ydCB0YXJnZXQpIHsNCisJCQlib29sZWFuIHJlc3VsdCA9IHRydWU7DQorCQkJcmVzdWx0ICY9IHNhbWVUeXBlKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOw0KKwkJCXJlc3VsdCAmPSByaWdodEViZW5lKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOw0KKwkJCXJlc3VsdCAmPSBvbmx5T25lSW5wdXQoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCk7DQorCQkJcmV0dXJuIHJlc3VsdDsNCisJCX0NCisNCisJCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbXVsdGlQb3J0TWFwcGluZ1J1bGVzKA0KKwkJCQljb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyLCBjb21yZWwuUG9ydCBzb3VyY2UsDQorCQkJCWNvbXJlbC5JbnB1dFBvcnQgdGFyZ2V0KSB7DQorCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KKwkJCXJlc3VsdCAmPSBzYW1lVHlwZShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KTsNCisJCQlyZXN1bHQgJj0gcmlnaHRFYmVuZShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KTsNCisJCQlyZXN1bHQgJj0gb25seU9uZUlucHV0KGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOw0KKwkJCXJldHVybiByZXN1bHQ7DQorCQl9DQorDQorCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG11bHRpU2luZ2xlUG9ydE1hcHBpbmdSdWxlcygNCisJCQkJY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciwgY29tcmVsLlBvcnQgc291cmNlLA0KKwkJCQljb21yZWwuSW5wdXRQb3J0IHRhcmdldCkgew0KKwkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCisJCQlyZXN1bHQgJj0gcmlnaHRTb3VyY2VUYXJnZXRUeXBlKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOw0KKwkJCXJlc3VsdCAmPSByaWdodEViZW5lKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOw0KKwkJCXJlc3VsdCAmPSBvbmx5T25lSW5wdXQoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCk7DQorCQkJcmVzdWx0ICY9IHNhbWVUeXBlKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOw0KKwkJCXJldHVybiByZXN1bHQ7DQorCQl9DQorDQorCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJpZ2h0U291cmNlVGFyZ2V0VHlwZSgNCisJCQkJY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciwgY29tcmVsLlBvcnQgc291cmNlLA0KKwkJCQljb21yZWwuSW5wdXRQb3J0IHRhcmdldCkgew0KKwkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCisJCQlpZiAoc291cmNlICE9IG51bGwpIHsNCisJCQkJcmVzdWx0ICY9IChzb3VyY2UgaW5zdGFuY2VvZiBJbnB1dFBvcnQpOw0KKwkJCQlyZXN1bHQgJj0gKHNvdXJjZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBRdWV1ZWRVbml0KTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdDsNCisJCX0NCisNCisJCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2FtZVR5cGUoY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciwNCisJCQkJY29tcmVsLlBvcnQgc291cmNlLCBjb21yZWwuSW5wdXRQb3J0IHRhcmdldCkgew0KKwkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCisJCQlpZiAoc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpIHsNCisJCQkJaWYgKHNvdXJjZS5nZXRUeXBlKCkgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0VHlwZSgpICE9IG51bGwpIHsNCisJCQkJCXJlc3VsdCA9IHNvdXJjZS5nZXRUeXBlKCkuZXF1YWxzKHRhcmdldC5nZXRUeXBlKCkpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJcmVzdWx0ID0gdHJ1ZTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJfQ0KKw0KKwl9DQorDQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmlnaHRFYmVuZShjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyLA0KKwkJCWNvbXJlbC5Qb3J0IHNvdXJjZSwgY29tcmVsLklucHV0UG9ydCB0YXJnZXQpIHsNCisJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsNCisJCWlmIChzb3VyY2UgIT0gbnVsbCkgew0KKwkJCWlmIChzb3VyY2UuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgSGVscGVyVW5pdCkNCisJCQkJcmVzdWx0ICY9IChzb3VyY2UgaW5zdGFuY2VvZiBPdXRwdXRQb3J0KTsNCisJCQlpZiAoc291cmNlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEF0b21pY1VuaXQpIHsNCisJCQkJcmVzdWx0ID0gZmFsc2U7DQorCQkJfQ0KKwkJCWlmICh0YXJnZXQgIT0gbnVsbCkgew0KKwkJCQlpZiAoc291cmNlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVVuaXQpIHsNCisJCQkJCXJlc3VsdCAmPSBzb3VyY2UuZUNvbnRhaW5lcigpID09IHRhcmdldC5lQ29udGFpbmVyKCkNCisJCQkJCQkJLmVDb250YWluZXIoKTsNCisNCisJCQkJfQ0KKwkJCQlpZiAoc291cmNlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIEhlbHBlclVuaXQpIHsNCisJCQkJCWlmICh0YXJnZXQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgSGVscGVyVW5pdCkgew0KKwkJCQkJCXJlc3VsdCAmPSBzb3VyY2UuZUNvbnRhaW5lcigpICE9IHRhcmdldC5lQ29udGFpbmVyKCk7DQorCQkJCQl9DQorCQkJCQlyZXN1bHQgJj0gKHNvdXJjZS5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpID09IHRhcmdldA0KKwkJCQkJCQkuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKSk7DQorCQkJCX0NCisJCQl9DQorDQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gb25seU9uZUlucHV0KGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIsDQorCQkJY29tcmVsLlBvcnQgc291cmNlLCBjb21yZWwuSW5wdXRQb3J0IHRhcmdldCkgew0KKwkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOw0KKwkJaWYgKHRhcmdldCAhPSBudWxsKSB7DQorCQkJTGlzdDxJbnB1dFBvcnQ+IHBvcnRzID0gbmV3IEFycmF5TGlzdDxJbnB1dFBvcnQ+KCk7DQorCQkJRU9iamVjdCBwb3J0Q29udGFpbmVyID0gdGFyZ2V0LmVDb250YWluZXIoKTsNCisJCQlpZiAocG9ydENvbnRhaW5lciBpbnN0YW5jZW9mIFJlZmFjdG9yaW5nVW5pdCkgew0KKwkJCQlSZWZhY3RvcmluZ1VuaXQgcmVmVW5pdCA9IChSZWZhY3RvcmluZ1VuaXQpIHBvcnRDb250YWluZXI7DQorCQkJCXBvcnRzLmFkZEFsbChyZWZVbml0LmdldEFsbElucHV0UG9ydHMoKSk7DQorCQkJfQ0KKwkJCWlmIChwb3J0Q29udGFpbmVyIGluc3RhbmNlb2YgSGVscGVyVW5pdCkgew0KKwkJCQlIZWxwZXJVbml0IGhlbHBlclVuaXQgPSAoSGVscGVyVW5pdCkgcG9ydENvbnRhaW5lcjsNCisJCQkJcG9ydHMuYWRkKGhlbHBlclVuaXQuZ2V0SW5wdXRQb3J0KCkpOw0KKwkJCX0NCisJCQlJbnB1dFBvcnQgcCA9IG51bGw7DQorCQkJZm9yIChJbnB1dFBvcnQgaW4gOiBwb3J0cykgew0KKwkJCQlpZiAodGFyZ2V0ID09IGluKSB7DQorCQkJCQlwID0gaW47DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocCAhPSBudWxsKSB7DQorCQkJCUxpc3Q8UG9ydE1hcHBpbmc+IG1hcHBpbmdzID0gY29udGFpbmVyLmdldFBvcnRNYXBwaW5ncygpOw0KKwkJCQlmb3IgKFBvcnRNYXBwaW5nIG1hcHBpbmcgOiBtYXBwaW5ncykgew0KKwkJCQkJaWYgKG1hcHBpbmcuZ2V0VGFyZ2V0KCkgPT0gcCkgew0KKwkJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbXJlbFRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29tcmVsVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM2ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbXJlbFRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyMjggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlckV4Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgZXh0ZW5kcyBOb25SZXNpemFibGVFZGl0UG9saWN5RXggew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEZpZ3VyZUxpc3RlbmVyIGhvc3RQb3NpdGlvbkxpc3RlbmVyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7DQorCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7DQorCQl9IGVsc2Ugew0KKwkJCXNob3dTZWxlY3Rpb24oKTsNCisJCQlzaG93Rm9jdXMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsNCisJCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOw0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7DQorCQl9IGVsc2Ugew0KKwkJCWhpZGVTZWxlY3Rpb24oKTsNCisJCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOw0KKwkJCWdldEhvc3RGaWd1cmUoKS5hZGRGaWd1cmVMaXN0ZW5lcihnZXRIb3N0UG9zaXRpb25MaXN0ZW5lcigpKTsNCisJCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsNCisJCQloaWRlRm9jdXMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsNCisJCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgew0KKwkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7DQorCQkJCWdldEhvc3RGaWd1cmUoKS5yZW1vdmVGaWd1cmVMaXN0ZW5lcihnZXRIb3N0UG9zaXRpb25MaXN0ZW5lcigpKTsNCisJCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOw0KKwkJCX0NCisJCQloaWRlRm9jdXMoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgew0KKwkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7DQorCQl9IGVsc2Ugew0KKwkJCWhpZGVGb2N1cygpOw0KKwkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOw0KKwkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsNCisJCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgew0KKwkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsNCisJCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgew0KKwkJUmVjdGFuZ2xlIGJvdW5kczsNCisJCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgew0KKwkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOw0KKwkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsNCisJCX0gZWxzZSB7DQorCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsNCisJCX0NCisJCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7DQorCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOw0KKwkJcmV0dXJuIGJvdW5kczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7DQorCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsNCisJCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOw0KKwkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsNCisJCQlmZWVkYmFja0ZpZ3VyZQ0KKwkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsNCisJCQlmZWVkYmFja0ZpZ3VyZQ0KKwkJCQkJLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsNCisJCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7DQorCQl9IGVsc2Ugew0KKwkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsNCisJCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsNCisJCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7DQorCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsNCisNCisJCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgew0KKwkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsNCisJCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOw0KKwkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7DQorCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsNCisJCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7DQorCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgew0KKwkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7DQorCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOw0KKwkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7DQorCQkJfSBlbHNlIHsNCisJCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsDQorCQkJCQkJNSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7DQorCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7DQorCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsNCisJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOw0KKwkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBGaWd1cmVMaXN0ZW5lciBnZXRIb3N0UG9zaXRpb25MaXN0ZW5lcigpIHsNCisJCWlmIChob3N0UG9zaXRpb25MaXN0ZW5lciA9PSBudWxsKSB7DQorCQkJaG9zdFBvc2l0aW9uTGlzdGVuZXIgPSBuZXcgRmlndXJlTGlzdGVuZXIoKSB7DQorCQkJCXB1YmxpYyB2b2lkIGZpZ3VyZU1vdmVkKElGaWd1cmUgc291cmNlKSB7DQorCQkJCQlyZWZyZXNoRmVlZGJhY2soKTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gaG9zdFBvc2l0aW9uTGlzdGVuZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7DQorCQlNb3ZlSGFuZGxlIG1vdmVIYW5kbGUgPSBuZXcgTW92ZUhhbmRsZSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSk7DQorCQltb3ZlSGFuZGxlLnNldEJvcmRlcihudWxsKTsNCisJCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtb3ZlSGFuZGxlKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db21yZWxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODdjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29tcmVsVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbFRleHRTZWxlY3Rpb25FZGl0UG9saWN5IGV4dGVuZHMgU2VsZWN0aW9uRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRmlndXJlTGlzdGVuZXIgaG9zdFBvc2l0aW9uTGlzdGVuZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsNCisJCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwcGluZ0xhYmVsKSB7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOw0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsNCisJCX0gZWxzZSB7DQorCQkJc2hvd1NlbGVjdGlvbigpOw0KKwkJCXNob3dGb2N1cygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgew0KKwkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7DQorCQkJKChXcmFwcGluZ0xhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsNCisJCX0gZWxzZSB7DQorCQkJaGlkZVNlbGVjdGlvbigpOw0KKwkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7DQorCQkJZ2V0SG9zdEZpZ3VyZSgpLmFkZEZpZ3VyZUxpc3RlbmVyKGdldEhvc3RQb3NpdGlvbkxpc3RlbmVyKCkpOw0KKwkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOw0KKwkJCWhpZGVGb2N1cygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgew0KKwkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOw0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7DQorCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsNCisJCQkJZ2V0SG9zdEZpZ3VyZSgpLnJlbW92ZUZpZ3VyZUxpc3RlbmVyKGdldEhvc3RQb3NpdGlvbkxpc3RlbmVyKCkpOw0KKwkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7DQorCQkJfQ0KKwkJCWhpZGVGb2N1cygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7DQorCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcHBpbmdMYWJlbCkgew0KKwkJCSgoV3JhcHBpbmdMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsNCisJCX0gZWxzZSB7DQorCQkJaGlkZUZvY3VzKCk7DQorCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7DQorCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgew0KKwkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBwaW5nTGFiZWwpIHsNCisJCQkoKFdyYXBwaW5nTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOw0KKwkJfSBlbHNlIHsNCisJCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7DQorCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOw0KKwkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7DQorCQlSZWN0YW5nbGUgYm91bmRzOw0KKwkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7DQorCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7DQorCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOw0KKwkJfQ0KKwkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsNCisJCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7DQorCQlyZXR1cm4gYm91bmRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsNCisJCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgew0KKwkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7DQorCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOw0KKwkJCWZlZWRiYWNrRmlndXJlDQorCQkJCQkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOw0KKwkJCWZlZWRiYWNrRmlndXJlDQorCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOw0KKwkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsNCisJCX0gZWxzZSB7DQorCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOw0KKwkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOw0KKwkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsNCisJCXJldHVybiBuZXcgRmlndXJlKCkgew0KKw0KKwkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7DQorCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOw0KKwkJCX0NCisJCX07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgew0KKwkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7DQorCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsNCisJCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOw0KKwkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsNCisJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7DQorCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsNCisJCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7DQorCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsNCisJCQl9IGVsc2Ugew0KKwkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwNCisJCQkJCQk1KSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsNCisJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsNCisJCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgew0KKwkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7DQorCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEZpZ3VyZUxpc3RlbmVyIGdldEhvc3RQb3NpdGlvbkxpc3RlbmVyKCkgew0KKwkJaWYgKGhvc3RQb3NpdGlvbkxpc3RlbmVyID09IG51bGwpIHsNCisJCQlob3N0UG9zaXRpb25MaXN0ZW5lciA9IG5ldyBGaWd1cmVMaXN0ZW5lcigpIHsNCisJCQkJcHVibGljIHZvaWQgZmlndXJlTW92ZWQoSUZpZ3VyZSBzb3VyY2UpIHsNCisJCQkJCXJlZnJlc2hGZWVkYmFjaygpOw0KKwkJCQl9DQorCQkJfTsNCisJCX0NCisJCXJldHVybiBob3N0UG9zaXRpb25MaXN0ZW5lcjsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uQ2hlY2tJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uQ2hlY2tJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxZGI1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25DaGVja0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uQ2hlY2tJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM3YTFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0XzMwMzBTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzAzMFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDhlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDMzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDlDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDhDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uQ2hlY2tFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwMzApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDlDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzJlZTcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0XzMwNDZTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA0NlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmQ2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDMzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDlDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDhDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uQ2hlY2tFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNWU4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA2NlNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdF8zMDY2U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlNzczMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25DaGVja0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNjYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDlDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwOWY3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0lucHV0UG9ydHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdF8zMDcxU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzFTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBkNzNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwzMzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbkNoZWNrRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDhDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2JhYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA3MlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDdlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDMzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDlDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDhDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uQ2hlY2tFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTg1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMzA3NVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdF8zMDc1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2YjBhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25DaGVja0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDlDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzUwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0XzIwMDZTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRfMjAwNlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDcyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0Vsc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDM4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzAzOFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDY5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA0Nik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjk2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0Vsc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDU0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzA1NFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YmI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2Nik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYTU3NjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0Vsc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDY0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzA2NFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NmM1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOGNjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0Vsc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDY4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzA2OFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjBkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3Mik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmYwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0Vsc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDc0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzA3NFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWNkODUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0Vsc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDg0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzA4NFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDQwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMjAwNik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGUzMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfRWxzZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50XzcwMjBTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDIwU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWU3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFBhcmFsbGVsUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUXVldWVkVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNlcXVlbnRpYWxVbml0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQXRvbWljVW5pdDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MDI5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDM2U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAzNlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0MGFhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1MSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiOWFmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDUyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA1MlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiNWI0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNjYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1MSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzMzdjYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDYyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA2MlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3ZWRlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1MSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmYzllMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDY2U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA2NlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlOWU2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1MSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlYTU2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDcyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA3MlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1NWZlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1MSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyNGRlOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDgyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA4MlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2NWM2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzIwMDYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1MSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTY2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMThTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDE4U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlN2Y1NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQzQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwMzApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1MSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmlsdGVyVW5pdDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3MDk2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25DaGVja0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9JZigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudF83MDM1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwMzVTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOWI2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbkNoZWNrQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25DaGVja0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdmZWVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbkNoZWNrRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0lmKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwNTFTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEID09IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFZpc3VhbElEKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA1MVNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNmI3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uQ2hlY2tDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNjYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25DaGVja18zMDc2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbkNoZWNrQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmMxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uQ2hlY2tFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfSWYoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA2MVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQgPT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VmlzdWFsSUQodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudF83MDYxU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxYTgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25DaGVja0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uQ2hlY2tDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkNjg5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25DaGVja0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9JZigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudF83MDY1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwNjVTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjFmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbkNoZWNrQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25DaGVja0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE0MjNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbkNoZWNrRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0lmKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwNzFTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEID09IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFZpc3VhbElEKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA3MVNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwZDM4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uQ2hlY2tDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25DaGVja18zMDc2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENvbmRpdGlvbkNoZWNrQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjU0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uQ2hlY2tFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfSWYoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA4MVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQgPT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VmlzdWFsSUQodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudF83MDgxU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ1OGNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25DaGVja0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMjAwNik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uQ2hlY2tDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGVjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25DaGVja0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0lmKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwMTdTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEID09IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFZpc3VhbElEKHZpZXcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzAxN1NlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2ZkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uQ2hlY2tDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDMwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25DaGVja0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlOWRkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVGhlbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwMzdTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDM3U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3Y2I0MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjZWI2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVGhlbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwNTNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDUzU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNjVmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDY2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkZmY0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVGhlbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwNjNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDYzU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMjlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyNTRjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVGhlbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwNjdTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDY3U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZGEyMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNjhmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVGhlbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwNzNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDczU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5NzNjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlNzY4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVGhlbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwODNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDgzU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmYTkxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8yMDA2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9UaGVuKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRfNzAxOVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJc3dpdGNoICh2aXN1YWxJRCkgew0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwMTlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL0NvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyMzNkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDMwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9Db25kaXRpb25hbFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzBlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvQ29uZGl0aW9uYWxVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25DaGVja0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb25kaXRpb25hbFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8yMDA2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkOWVjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF9JbnB1dFBvcnQoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfT3V0cHV0UG9ydCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfMzAzOVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0XzMwMzlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDgxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aU91dHB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAzOSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDVDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThjNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZXQgZ2V0RmVhdHVyZXNUb1N5bmNocm9uaXplKCkgew0KKwkJaWYgKG15RmVhdHVyZXNUb1N5bmNocm9uaXplID09IG51bGwpIHsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0X1NlY29uZGFyeUlucHV0UG9ydHMoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF9PdXRwdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDUxU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfMzA1MVNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5NWEzYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDUxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTA2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfSW5wdXRQb3J0KCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfU2Vjb25kYXJ5SW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0XzMwNTZTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDU2U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWYyZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAxMyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aU91dHB1dFBvcnRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNGNkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF9JbnB1dFBvcnQoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfT3V0cHV0UG9ydCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfMzA2MlNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0XzMwNjJTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDNhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGZWF0dXJlVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aU91dHB1dFBvcnRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA2Mik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDVDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5YzNhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfSW5wdXRQb3J0KCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmVhdHVyZVVuaXRfU2Vjb25kYXJ5SW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRNdWx0aUZlYXR1cmVVbml0XzMwMTJTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDEyU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmVhdHVyZVVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlZDYxYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjI5OThmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpT3V0cHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aUZpbHRlclVuaXRfT3V0cHV0UG9ydCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldE11bHRpRmlsdGVyVW5pdF8zMDQxU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNDFTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgzNmVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDQxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZpbHRlclVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGIwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZXQgZ2V0RmVhdHVyZXNUb1N5bmNocm9uaXplKCkgew0KKwkJaWYgKG15RmVhdHVyZXNUb1N5bmNocm9uaXplID09IG51bGwpIHsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aUZpbHRlclVuaXRfSW5wdXRQb3J0KCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmlsdGVyVW5pdF9PdXRwdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNTNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRNdWx0aUZpbHRlclVuaXRfMzA1M1NlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZpbHRlclVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjJmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpT3V0cHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDIwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDIxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyYWY3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRNdWx0aUZpbHRlclVuaXRfMzA1OFNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldE11bHRpRmlsdGVyVW5pdF8zMDU4U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZpbHRlclVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNDU4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZpbHRlclVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZpbHRlclVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTk3NGMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpT3V0cHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aUZpbHRlclVuaXRfT3V0cHV0UG9ydCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldE11bHRpRmlsdGVyVW5pdF8zMDY0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZlNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDY0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWVjNDhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpRmlsdGVyVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0TXVsdGlGaWx0ZXJVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRNdWx0aUZpbHRlclVuaXRfMzAxOVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldE11bHRpRmlsdGVyVW5pdF8zMDE5U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUZpbHRlclVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyODVmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlGaWx0ZXJVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwMTkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDIwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDIxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTczNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCUNvbW1hbmQgY29tbWFuZCA9IHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSkNCisJCQkJOiBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJCXJldHVybiBjb21tYW5kICE9IG51bGwgPyBjb21tYW5kIDogc3VwZXINCisJCQkJLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlDQorCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdkM2UyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQ0KKwkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7DQorCQljYXNlIE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2YzJmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBpbmNvbWluZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJQ29tbWFuZCBjb21tYW5kID0gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKQ0KKwkJCQk6IGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwkJcmV0dXJuIGNvbW1hbmQgIT0gbnVsbCA/IGNvbW1hbmQgOiBzdXBlcg0KKwkJCQkuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKHJlcSkpOw0KKwkJY2FzZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzlmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCUNvbW1hbmQgY29tbWFuZCA9IHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSkNCisJCQkJOiBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJCXJldHVybiBjb21tYW5kICE9IG51bGwgPyBjb21tYW5kIDogc3VwZXINCisJCQkJLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlDQorCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJkNWExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDIwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQ0KKwkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7DQorCQljYXNlIE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkMzlmYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBpbmNvbWluZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJQ29tbWFuZCBjb21tYW5kID0gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKQ0KKwkJCQk6IGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwkJcmV0dXJuIGNvbW1hbmQgIT0gbnVsbCA/IGNvbW1hbmQgOiBzdXBlcg0KKwkJCQkuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKHJlcSkpOw0KKwkJY2FzZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQ4SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODMyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQ4SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCUNvbW1hbmQgY29tbWFuZCA9IHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSkNCisJCQkJOiBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJCXJldHVybiBjb21tYW5kICE9IG51bGwgPyBjb21tYW5kIDogc3VwZXINCisJCQkJLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlDQorCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnQ5SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0OUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzFiNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0OUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnQ5SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQ5SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQ0KKwkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7DQorCQljYXNlIE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpSW5wdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NmYzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlJbnB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCUNvbW1hbmQgY29tbWFuZCA9IHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSkNCisJCQkJOiBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJCXJldHVybiBjb21tYW5kICE9IG51bGwgPyBjb21tYW5kIDogc3VwZXINCisJCQkJLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlDQorCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9NdWx0aU91dHB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjk3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpT3V0cHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDIxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCUNvbW1hbmQgY29tbWFuZCA9IHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSkNCisJCQkJOiBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJCXJldHVybiBjb21tYW5kICE9IG51bGwgPyBjb21tYW5kIDogc3VwZXINCisJCQkJLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0U3RhcnRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlDQorCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlPdXRwdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpT3V0cHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U1ZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpT3V0cHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBvdXRnb2luZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQ0KKwkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7DQorCQljYXNlIE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpUG9ydE1hcHBpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTYwMTlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpUG9ydE1hcHBpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcnRNYXBwaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpU2luZ2xlUG9ydE1hcHBpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU0ZGVmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL011bHRpU2luZ2xlUG9ydE1hcHBpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL09wZW5EaWFncmFtRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL09wZW5EaWFncmFtRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTUwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvT3BlbkRpYWdyYW1FZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk9wZW5FZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkhpbnRlZERpYWdyYW1MaW5rU3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uU3R5bGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JVdGlsOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgT3BlbkRpYWdyYW1FZGl0UG9saWN5IGV4dGVuZHMgT3BlbkVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0T3BlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOw0KKwkJaWYgKGZhbHNlID09IHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlWaWV3IHZpZXcgPSAoVmlldykgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKTsNCisJCVN0eWxlIGxpbmsgPSB2aWV3LmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJLmdldEhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlpZiAoZmFsc2UgPT0gbGluayBpbnN0YW5jZW9mIEhpbnRlZERpYWdyYW1MaW5rU3R5bGUpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShuZXcgT3BlbkRpYWdyYW1Db21tYW5kKA0KKwkJCQkoSGludGVkRGlhZ3JhbUxpbmtTdHlsZSkgbGluaykpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBPcGVuRGlhZ3JhbUNvbW1hbmQgZXh0ZW5kcw0KKwkJCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgZmluYWwgSGludGVkRGlhZ3JhbUxpbmtTdHlsZSBkaWFncmFtRmFjZXQ7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJT3BlbkRpYWdyYW1Db21tYW5kKEhpbnRlZERpYWdyYW1MaW5rU3R5bGUgbGlua1N0eWxlKSB7DQorCQkJLy8gZWRpdGluZyBkb21haW4gaXMgdGFrZW4gZm9yIG9yaWdpbmFsIGRpYWdyYW0sIA0KKwkJCS8vIGlmIHdlIG9wZW4gZGlhZ3JhbSBmcm9tIGFub3RoZXIgZmlsZSwgd2Ugc2hvdWxkIHVzZSBhbm90aGVyIGVkaXRpbmcgZG9tYWluDQorCQkJc3VwZXIoVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4obGlua1N0eWxlKSwNCisJCQkJCU1lc3NhZ2VzLkNvbW1hbmROYW1lX09wZW5EaWFncmFtLCBudWxsKTsNCisJCQlkaWFncmFtRmFjZXQgPSBsaW5rU3R5bGU7DQorCQl9DQorDQorCQkvLyBGSVhNRSBjYW5FeGVjdXRlIGlmICAhKHJlYWRPbmx5ICYmIGdldERpYWdyYW1Ub09wZW4gPT0gbnVsbCksIGkuZS4gb3BlbiB3b3JrcyBvbiBybyBkaWFncmFtcyBvbmx5IHdoZW4gdGhlcmUncyBhc3NvY2lhdGVkIGRpYWdyYW0gYWxyZWFkeQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KKwkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJCXRyeSB7DQorCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW1Ub09wZW4oKTsNCisJCQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkgew0KKwkJCQkJZGlhZ3JhbSA9IGludGlhbGl6ZU5ld0RpYWdyYW0oKTsNCisJCQkJfQ0KKwkJCQlVUkkgdXJpID0gRWNvcmVVdGlsLmdldFVSSShkaWFncmFtKTsNCisJCQkJU3RyaW5nIGVkaXRvck5hbWUgPSB1cmkubGFzdFNlZ21lbnQoKSArICcjJw0KKwkJCQkJCSsgZGlhZ3JhbS5lUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmluZGV4T2YoZGlhZ3JhbSk7DQorCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBVUklFZGl0b3JJbnB1dCh1cmksIGVkaXRvck5hbWUpOw0KKwkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KKwkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQorCQkJCXBhZ2Uub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgZ2V0RWRpdG9ySUQoKSk7DQorCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOw0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KKwkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJDYW4ndCBvcGVuIGRpYWdyYW0iLCBleCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBEaWFncmFtIGdldERpYWdyYW1Ub09wZW4oKSB7DQorCQkJcmV0dXJuIGRpYWdyYW1GYWNldC5nZXREaWFncmFtTGluaygpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBEaWFncmFtIGludGlhbGl6ZU5ld0RpYWdyYW0oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCQlEaWFncmFtIGQgPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKGdldERpYWdyYW1Eb21haW5FbGVtZW50KCksDQorCQkJCQlnZXREaWFncmFtS2luZCgpLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJaWYgKGQgPT0gbnVsbCkgew0KKwkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJDYW4ndCBjcmVhdGUgZGlhZ3JhbSBvZiAnIg0KKwkJCQkJCSsgZ2V0RGlhZ3JhbUtpbmQoKSArICInIGtpbmQiKTsNCisJCQl9DQorCQkJZGlhZ3JhbUZhY2V0LnNldERpYWdyYW1MaW5rKGQpOw0KKwkJCWFzc2VydCBkaWFncmFtRmFjZXQuZVJlc291cmNlKCkgIT0gbnVsbDsNCisJCQlkaWFncmFtRmFjZXQuZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoZCk7DQorCQkJRU9iamVjdCBjb250YWluZXIgPSBkaWFncmFtRmFjZXQuZUNvbnRhaW5lcigpOw0KKwkJCXdoaWxlIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJCSgoVmlldykgY29udGFpbmVyKS5wZXJzaXN0KCk7DQorCQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQkJfQ0KKwkJCXRyeSB7DQorCQkJCW5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7DQorCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCisJCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sDQorCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsNCisJCQkJCQl0cnkgew0KKwkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlhZ3JhbUZhY2V0LmVSZXNvdXJjZSgpDQorCQkJCQkJCQkJLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7DQorCQkJCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkNCisJCQkJCQkJCQkJJiYgIWdldEVkaXRpbmdEb21haW4oKS5pc1JlYWRPbmx5KA0KKwkJCQkJCQkJCQkJCW5leHRSZXNvdXJjZSkpIHsNCisJCQkJCQkJCQluZXh0UmVzb3VyY2Uuc2F2ZShDb21yZWxEaWFncmFtRWRpdG9yVXRpbA0KKwkJCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCisJCQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgsDQorCQkJCQkJCQkJIlNhdmUgb3BlcmF0aW9uIGZhaWxlZCIpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfS5ydW4obnVsbCk7DQorCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7DQorCQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBkaWFncmFtIG9mICciDQorCQkJCQkJKyBnZXREaWFncmFtS2luZCgpICsgIicga2luZCIsIGUpOw0KKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIGRpYWdyYW0gb2YgJyINCisJCQkJCQkrIGdldERpYWdyYW1LaW5kKCkgKyAiJyBraW5kIiwgZSk7DQorCQkJfQ0KKwkJCXJldHVybiBkOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBFT2JqZWN0IGdldERpYWdyYW1Eb21haW5FbGVtZW50KCkgew0KKwkJCS8vIHVzZSBzYW1lIGVsZW1lbnQgYXMgYXNzb2NpYXRlZCB3aXRoIEVQDQorCQkJcmV0dXJuICgoVmlldykgZGlhZ3JhbUZhY2V0LmVDb250YWluZXIoKSkuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgew0KKwkJCS8vIFhYWCBwcmVmaGludCBmcm9tIHRhcmdldCBkaWFncmFtJ3MgZWRpdG9yPw0KKwkJCXJldHVybiBDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1LaW5kKCkgew0KKwkJCXJldHVybiBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lEOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySUQoKSB7DQorCQkJcmV0dXJuIENvbXJlbERpYWdyYW1FZGl0b3IuSUQ7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDA0ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0cygpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMDRTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJlNTIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExY2JiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydHMoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNlNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM2U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0ODAxNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjEyMGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0cygpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMzdTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE0YmVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDkzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZXQgZ2V0RmVhdHVyZXNUb1N5bmNocm9uaXplKCkgew0KKwkJaWYgKG15RmVhdHVyZXNUb1N5bmNocm9uaXplID09IG51bGwpIHsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M1NlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjdmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhOTRmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydHMoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkYjIwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzYyMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0cygpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDhTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODE0YjNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM5ZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydHMoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMjAwM1NlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZTI1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwNSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJmZjMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDIzU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmU0ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTk5NGJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjVTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDI1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjEwM2FkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDFmOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjlTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDI5U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzcyN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0Myk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjgwZjZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMzNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDMzU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ2YWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWIyZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNDFTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQxU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njc0MDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDJjMGViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNzVTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMjAwMyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1NzkyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAwNVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJc3dpdGNoICh2aXN1YWxJRCkgew0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDVTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjVhNWU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlNWQwZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwMjRTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDI0U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmNTA3OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlYmJkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwMjZTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDI2U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhYzFiYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4YTFlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwMzBTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDMwU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyMGQ4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5YjkxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwMzRTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDM0U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyYTEwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NzY3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNDJTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDQyU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxYjhmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwZGNlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNzZTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDc2U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxMmZiMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5BdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ2FydGVzaWFuUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUXVldWVkVW5pdDNDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8yMDAzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODg4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAwNlNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJc3dpdGNoICh2aXN1YWxJRCkgew0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwMDZTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1BhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1M2JjMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9QYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQzQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDA0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQzQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTkzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdF8zMDI2U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMzAyNlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA5YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwMjYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyOCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjhlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdF8zMDQ0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMzA0NFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWY0MDUwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA0NCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFiYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMzA2MFNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0XzMwNjBTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkN2M0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyOCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxNWY1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0lucHV0UG9ydHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0XzMwNjlTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdF8zMDY5U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2IzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDY5KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmVkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9JbnB1dFBvcnRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdF8zMDcwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMzA3MFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ0NzA3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsNCisJCQkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsNCisJCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njc4ODczCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMzA3M1NlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0XzMwNzNTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiMjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyOCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDhDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZTM1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfSW5wdXRQb3J0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRfMjAwNVNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0XzIwMDVTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWI2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8yMDA1KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZWQ1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDMxU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMzFTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0Yjg3YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA0NCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjBjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQ3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNDdTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjMjMzMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTc0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDU3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNTdTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhOThkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2OSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzc1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDU5U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNTlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2Y2U2NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTJkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDY5U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNjlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMDU5NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3Myk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWRmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc5U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNzlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ZmQxZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMjAwNSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjYxMjFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMTNTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAxM1NlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5YWUxYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZlYXR1cmVVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUZpbHRlclVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGaWx0ZXJVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWJmMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDMyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwMzJTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NGQ0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDQ0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTNkN2ExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDQ4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNDhTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDU2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDYwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ2ODUyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDU4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNThTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjJhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDY5KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDAwNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDYwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNjBTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODAxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDcwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTYxNGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDcwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNzBTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzVjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTIxNjExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDgwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwODBTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDQzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8yMDA1KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4OTllNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9SZWZhY3RvcmluZ1VuaXRzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwMTRTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAxNFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTMyODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDI2KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IENhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzAgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2VxdWVudGlhbFVuaXQ2Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ29uZGl0aW9uYWxVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBBdG9taWNVbml0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwY2M2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhY2FjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAzOCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDA3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDUwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDUwU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDY2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1MCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDdmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDU1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDU1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDI1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2M2JmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDYxU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDYxU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA2MSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGZWF0dXJlVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzBmNDRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZlYXR1cmVVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfSW5wdXRQb3J0KCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0X1NlY29uZGFyeUlucHV0UG9ydHMoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfT3V0cHV0UG9ydCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0XzMwMDhTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZUZlYXR1cmVVbml0XzMwMDhTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZjNkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmVhdHVyZVVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQzQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGZWF0dXJlVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0M0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVPdXRwdXRQb3J0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZkYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZpbHRlclVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF9PdXRwdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDQwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZUZpbHRlclVuaXRfMzA0MFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzZGVjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyYTM5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZpbHRlclVuaXRfSW5wdXRQb3J0KCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZUZpbHRlclVuaXRfT3V0cHV0UG9ydCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZUZpbHRlclVuaXRfMzA1MlNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZpbHRlclVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZpbHRlclVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTdmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Mik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZmU4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZXQgZ2V0RmVhdHVyZXNUb1N5bmNocm9uaXplKCkgew0KKwkJaWYgKG15RmVhdHVyZXNUb1N5bmNocm9uaXplID09IG51bGwpIHsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVGaWx0ZXJVbml0X0lucHV0UG9ydCgpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVGaWx0ZXJVbml0X091dHB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTdTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDU3U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODYzYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZpbHRlclVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlclVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxOCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjgwMmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUZpbHRlclVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1VcGRhdGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbE5vZGVEZXNjcmlwdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF9PdXRwdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDYzU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZUZpbHRlclVuaXRfMzA2M1NlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjYTI0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNtZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBudWxsKTsNCisJCWNtZC5zZXRUcmFuc2FjdGlvbk5lc3RpbmdFbmFibGVkKGZhbHNlKTsNCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY21kKTsNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKElDb21wb3NpdGVDb21tYW5kIGNtZCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBuaXQgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgbml0Lmhhc05leHQoKTspIHsNCisJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbml0Lm5leHQoKTsNCisJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGVjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF9PdXRwdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDE2U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZUZpbHRlclVuaXRfMzAxNlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVGaWx0ZXJVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzM0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDVDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlclVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZU91dHB1dFBvcnQyQ3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU2YzQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFjN2UwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDNJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwNSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY3YmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwOSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM3ZjcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAxMyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTRlYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDZJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQyNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0OEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBkNGRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ4SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlSW5wdXRQb3J0OUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTA2YmZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydDlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydDlJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQ5SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgaW5jb21pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyA9PSByZXENCisJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UNCisJICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKA0KKwkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZUlucHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVJbnB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhODBjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVJbnB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUlucHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGluY29taW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBpbmNvbWluZ0xpbmspKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJQ29tbWFuZCBjb21tYW5kID0gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKQ0KKwkJCQk6IGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwkJcmV0dXJuIGNvbW1hbmQgIT0gbnVsbCA/IGNvbW1hbmQgOiBzdXBlcg0KKwkJCQkuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzID09IHJlcQ0KKwkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPT0gcmVxDQorCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kKHJlcSwNCisJCQkJCXJlcS5nZXRTb3VyY2UoKSwgcmVxLmdldFRhcmdldCgpKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlDQorCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsNCisJCWNhc2UgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKHJlcSkpOw0KKwkJY2FzZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDcyODkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZU91dHB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVPdXRwdXRQb3J0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IHZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG91dGdvaW5nTGluaykpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJQ29tbWFuZCBjb21tYW5kID0gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKQ0KKwkJCQk6IGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwkJcmV0dXJuIGNvbW1hbmQgIT0gbnVsbCA/IGNvbW1hbmQgOiBzdXBlcg0KKwkJCQkuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTdGFydENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQocmVxLA0KKwkJCQkJcmVxLmdldFNvdXJjZSgpLCByZXEuZ2V0VGFyZ2V0KCkpKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21wbGV0ZUNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQ0KKwkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoDQorCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7DQorCQljYXNlIFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVQb3J0TWFwcGluZ1Jlb3JpZW50Q29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlT3V0cHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVPdXRwdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjgyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlT3V0cHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlT3V0cHV0UG9ydEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgb3V0Z29pbmdMaW5rKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQorCQkJLy8gdGhlcmUgYXJlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBjaGlsZHJlbiwgbmVlZCBleHRyYSBjb21tYW5kczogZmFsc2UNCisJCQlhZGREZXN0cm95U2hvcnRjdXRzQ29tbWFuZChjbWQsIHZpZXcpOw0KKwkJCS8vIGRlbGV0ZSBob3N0IGVsZW1lbnQNCisJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7DQorCQl9IGVsc2Ugew0KKwkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCB2aWV3KSk7DQorCQl9DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihjbWQucmVkdWNlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlDb21tYW5kIGNvbW1hbmQgPSByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpDQorCQkJCTogZ2V0Q29tcGxldGVDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCQlyZXR1cm4gY29tbWFuZCAhPSBudWxsID8gY29tbWFuZCA6IHN1cGVyDQorCQkJCS5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFN0YXJ0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nQ3JlYXRlQ29tbWFuZChyZXEsDQorCQkJCQlyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENvbXBsZXRlQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlDQorCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgNCisJCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7DQorCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsNCisJCWNhc2UgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjExZWQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVBvcnRNYXBwaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUG9ydE1hcHBpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVQb3J0TWFwcGluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2RkYjZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuU2V0Vmlld011dGFiaWxpdHlDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbVVwZGF0ZXI7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsTm9kZURlc2NyaXB0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZXQgZ2V0RmVhdHVyZXNUb1N5bmNocm9uaXplKCkgew0KKwkJaWYgKG15RmVhdHVyZXNUb1N5bmNocm9uaXplID09IG51bGwpIHsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydCgpKTsNCisJCX0NCisJCXJldHVybiBteUZlYXR1cmVzVG9TeW5jaHJvbml6ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfMzAyMlNlbWFudGljQ2hpbGRyZW4odmlld09iamVjdCk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIGQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJcmVzdWx0LmFkZChkLmdldE1vZGVsRWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzT3JwaGFuZWQoQ29sbGVjdGlvbjxFT2JqZWN0PiBzZW1hbnRpY0NoaWxkcmVuLA0KKwkJCWZpbmFsIFZpZXcgdmlldykgew0KKwkJcmV0dXJuIGlzTXlEaWFncmFtRWxlbWVudCh2aWV3KQ0KKwkJCQkmJiAhc2VtYW50aWNDaGlsZHJlbi5jb250YWlucyh2aWV3LmdldEVsZW1lbnQoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc015RGlhZ3JhbUVsZW1lbnQoVmlldyB2aWV3KSB7DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOw0KKwkJcmV0dXJuIHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQNCisJCQkJfHwgdmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfMzAyMlNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3MjZmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tcG9zaXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUlucHV0UG9ydDdDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMNCisJCUNvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjbWQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbnVsbCk7DQorCQljbWQuc2V0VHJhbnNhY3Rpb25OZXN0aW5nRW5hYmxlZChmYWxzZSk7DQorCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KKwkJCS8vIHRoZXJlIGFyZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgY2hpbGRyZW4sIG5lZWQgZXh0cmEgY29tbWFuZHM6IGZhbHNlDQorCQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNtZCk7DQorCQkJYWRkRGVzdHJveVNob3J0Y3V0c0NvbW1hbmQoY21kLCB2aWV3KTsNCisJCQkvLyBkZWxldGUgaG9zdCBlbGVtZW50DQorCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOw0KKwkJfSBlbHNlIHsNCisJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgdmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEdFRldyYXBwZXIoY21kLnJlZHVjZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChJQ29tcG9zaXRlQ29tbWFuZCBjbWQpIHsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbml0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IG5pdC5oYXNOZXh0KCk7KSB7DQorCQkJTm9kZSBub2RlID0gKE5vZGUpIG5pdC5uZXh0KCk7DQorCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG5vZGUpKSB7DQorCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2UgaW5jb21pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlpbmNvbWluZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCWluY29taW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBvdXRnb2luZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQob3V0Z29pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBub2RlKSk7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJTm9kZSBjbm9kZSA9IChOb2RlKSBjaXQubmV4dCgpOw0KKwkJCQkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgew0KKwkJCQkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzgyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDQyU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDQyU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmYyY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0Mik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2EwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU0U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY1MDAwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjgyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU5U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU5U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU3MmRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1OSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZmU5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ3M2QyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjRjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNldCBnZXRGZWF0dXJlc1RvU3luY2hyb25pemUoKSB7DQorCQlpZiAobXlGZWF0dXJlc1RvU3luY2hyb25pemUgPT0gbnVsbCkgew0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplID0gbmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPigpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpKTsNCisJCQlteUZlYXR1cmVzVG9TeW5jaHJvbml6ZS5hZGQoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG15RmVhdHVyZXNUb1N5bmNocm9uaXplOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlyZXR1cm4gdmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRA0KKwkJCQl8fCB2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmFkMDRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21wb3NpdGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlSW5wdXRQb3J0NkNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzDQorCQlDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2Nyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZmMDRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5EZWZlcnJlZExheW91dENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVmlld1JlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2V0IGdldEZlYXR1cmVzVG9TeW5jaHJvbml6ZSgpIHsNCisJCWlmIChteUZlYXR1cmVzVG9TeW5jaHJvbml6ZSA9PSBudWxsKSB7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUgPSBuZXcgSGFzaFNldDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7DQorCQkJbXlGZWF0dXJlc1RvU3luY2hyb25pemUuYWRkKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFDQorCQkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJCW15RmVhdHVyZXNUb1N5bmNocm9uaXplLmFkZChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnQoKSk7DQorCQl9DQorCQlyZXR1cm4gbXlGZWF0dXJlc1RvU3luY2hyb25pemU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXJldHVybiB2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEDQorCQkJCXx8IHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjA1NjVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbXBvc2l0ZUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlJbnB1dFBvcnQ3Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVJbnB1dFBvcnQ2Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcw0KKwkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkgew0KKwkJc3VwZXIoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7DQorCQlpZiAoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IE11bHRpSW5wdXRQb3J0N0NyZWF0ZUNvbW1hbmQocmVxKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY21kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG51bGwpOw0KKwkJY21kLnNldFRyYW5zYWN0aW9uTmVzdGluZ0VuYWJsZWQoZmFsc2UpOw0KKwkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsNCisJCQkvLyB0aGVyZSBhcmUgaW5kaXJlY3RseSByZWZlcmVuY2VkIGNoaWxkcmVuLCBuZWVkIGV4dHJhIGNvbW1hbmRzOiBmYWxzZQ0KKwkJCWFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChjbWQpOw0KKwkJCWFkZERlc3Ryb3lTaG9ydGN1dHNDb21tYW5kKGNtZCwgdmlldyk7DQorCQkJLy8gZGVsZXRlIGhvc3QgZWxlbWVudA0KKwkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKTsNCisJCX0gZWxzZSB7DQorCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIHZpZXcpKTsNCisJCX0NCisJCXJldHVybiBnZXRHRUZXcmFwcGVyKGNtZC5yZWR1Y2UoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoSUNvbXBvc2l0ZUNvbW1hbmQgY21kKSB7DQorCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IG5pdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBuaXQuaGFzTmV4dCgpOykgew0KKwkJCU5vZGUgbm9kZSA9IChOb2RlKSBuaXQubmV4dCgpOw0KKwkJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgew0KKwkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIGluY29taW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChpbmNvbWluZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGluY29taW5nTGluaykgPT0gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCWluY29taW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG5vZGUuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlFZGdlIG91dGdvaW5nTGluayA9IChFZGdlKSBpdC5uZXh0KCk7DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlvdXRnb2luZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIG5vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIG5vZGUpKTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBub2RlLmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQkJRWRnZSBpbmNvbWluZ0xpbmsgPSAoRWRnZSkgaXQubmV4dCgpOw0KKwkJCQkJaWYgKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaW5jb21pbmdMaW5rKSA9PSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHIgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCQkJaW5jb21pbmdMaW5rLmdldEVsZW1lbnQoKSwgZmFsc2UpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyKSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQlpbmNvbWluZ0xpbmspKTsNCisJCQkJCQljb250aW51ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbm9kZS5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCUVkZ2Ugb3V0Z29pbmdMaW5rID0gKEVkZ2UpIGl0Lm5leHQoKTsNCisJCQkJCWlmIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKG91dGdvaW5nTGluaykgPT0gTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQkJCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgNCisJCQkJCQkJCW91dGdvaW5nTGluay5nZXRFbGVtZW50KCksIGZhbHNlKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocikpOw0KKwkJCQkJCWNtZC5hZGQobmV3IERlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJb3V0Z29pbmdMaW5rKSk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvdXRnb2luZ0xpbmspID09IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgciA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoDQorCQkJCQkJCQlvdXRnb2luZ0xpbmsuZ2V0RWxlbWVudCgpLCBmYWxzZSk7DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHIpKTsNCisJCQkJCQljbWQuYWRkKG5ldyBEZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCW91dGdvaW5nTGluaykpOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KA0KKwkJCQkJCWdldEVkaXRpbmdEb21haW4oKSwgbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2Ygbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgbm9kZSkpOw0KKwkJCQlicmVhazsNCisJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQkJY21kLmFkZChuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKA0KKwkJCQkJCQkJbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJCQkJCWNub2RlLmdldEVsZW1lbnQoKSwgZmFsc2UpKSk7IC8vIGRpcmVjdGx5T3duZWQ6IHRydWUNCisJCQkJCQkvLyBkb24ndCBuZWVkIGV4cGxpY2l0IGRlbGV0aW9uIG9mIGNub2RlIGFzIHBhcmVudCdzIHZpZXcgZGVsZXRpb24gd291bGQgY2xlYW4gY2hpbGQgdmlld3MgYXMgd2VsbCANCisJCQkJCQkvLyBjbWQuYWRkKG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGNub2RlKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWZvciAoSXRlcmF0b3I8Pz4gY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdA0KKwkJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7DQorCQkJCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoY25vZGUpKSB7DQorCQkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQkJCWNtZC5hZGQobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZCgNCisJCQkJCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLA0KKwkJCQkJCQkJCQljbm9kZS5nZXRFbGVtZW50KCksIGZhbHNlKSkpOyAvLyBkaXJlY3RseU93bmVkOiB0cnVlDQorCQkJCQkJLy8gZG9uJ3QgbmVlZCBleHBsaWNpdCBkZWxldGlvbiBvZiBjbm9kZSBhcyBwYXJlbnQncyB2aWV3IGRlbGV0aW9uIHdvdWxkIGNsZWFuIGNoaWxkIHZpZXdzIGFzIHdlbGwgDQorCQkJCQkJLy8gY21kLmFkZChuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBjbm9kZSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJCQljbWQuYWRkKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQoDQorCQkJCQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCQkJCQkJY25vZGUuZ2V0RWxlbWVudCgpLCBmYWxzZSkpKTsgLy8gZGlyZWN0bHlPd25lZDogdHJ1ZQ0KKwkJCQkJCS8vIGRvbid0IG5lZWQgZXhwbGljaXQgZGVsZXRpb24gb2YgY25vZGUgYXMgcGFyZW50J3MgdmlldyBkZWxldGlvbiB3b3VsZCBjbGVhbiBjaGlsZCB2aWV3cyBhcyB3ZWxsIA0KKwkJCQkJCS8vIGNtZC5hZGQobmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kKGdldEVkaXRpbmdEb21haW4oKSwgY25vZGUpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUzMzJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDI3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDI3U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2MDEzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDQyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY4NDdkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0Nhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQzU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQzU2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxMmU1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ3OWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQ1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQ1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmNTk1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGMwYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQ5U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQ5U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1MmM5MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDY1KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDk3NDlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDU1U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDU1U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMDRkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDY3KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmRlZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7DQorCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7DQorCQlMaW5rZWRMaXN0PEVPYmplY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PEVPYmplY3Q+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc3U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc3U2VtYW50aWNDaGlsZHJlbigoVmlldykgZ2V0SG9zdCgpDQorCQkJCQkJLmdldE1vZGVsKCkpOw0KKwkJTGlua2VkTGlzdDxWaWV3PiBvcnBoYW5lZCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQkvLyB3ZSBjYXJlIHRvIGNoZWNrIG9ubHkgdmlld3Mgd2UgcmVjb2duaXplIGFzIG91cnMNCisJCUxpbmtlZExpc3Q8Vmlldz4ga25vd25WaWV3Q2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IHYgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCWlmIChpc015RGlhZ3JhbUVsZW1lbnQodikpIHsNCisJCQkJa25vd25WaWV3Q2hpbGRyZW4uYWRkKHYpOw0KKwkJCX0NCisJCX0NCisJCS8vIGFsdGVybmF0aXZlIHRvICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oZ2V0Vmlld0NoaWxkcmVuKCksIHNlbWFudGljQ2hpbGRyZW4pDQorCQkvLw0KKwkJLy8gaXRlcmF0aW9uIGhhcHBlbnMgb3ZlciBsaXN0IG9mIGRlc2lyZWQgc2VtYW50aWMgZWxlbWVudHMsIHRyeWluZyB0byBmaW5kIGJlc3QgbWF0Y2hpbmcgVmlldywgd2hpbGUgb3JpZ2luYWwgQ0VQDQorCQkvLyBpdGVyYXRlcyB2aWV3cywgcG90ZW50aWFsbHkgbG9zaW5nIHZpZXcgKHNpemUvYm91bmRzKSBpbmZvcm1hdGlvbiAtIGkuZS4gaWYgdGhlcmUgYXJlIGZldyB2aWV3cyB0byByZWZlcmVuY2Ugc2FtZSBFT2JqZWN0LCBvbmx5IGxhc3Qgb25lIA0KKwkJLy8gdG8gYW5zd2VyIGlzT3JwaGFuZWQgPT0gdHJ1ZSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBkb21haW4gZWxlbWVudCByZXByZXNlbnRhdGlvbiwgc2VlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4oKQ0KKwkJZm9yIChJdGVyYXRvcjxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNJdGVyYXRvciA9IGNoaWxkRGVzY3JpcHRvcnMNCisJCQkJLml0ZXJhdG9yKCk7IGRlc2NyaXB0b3JzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKwkJCUNvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgPSBkZXNjcmlwdG9yc0l0ZXJhdG9yLm5leHQoKTsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUxpbmtlZExpc3Q8Vmlldz4gcGVyZmVjdE1hdGNoID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsgLy8gYm90aCBzZW1hbnRpY0VsZW1lbnQgYW5kIGhpbnQgbWF0Y2ggdGhhdCBvZiBOb2RlRGVzY3JpcHRvcg0KKwkJCWZvciAoVmlldyBjaGlsZFZpZXcgOiBnZXRWaWV3Q2hpbGRyZW4oKSkgew0KKwkJCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGNoaWxkVmlldy5nZXRFbGVtZW50KCk7DQorCQkJCWlmIChuZXh0LmdldE1vZGVsRWxlbWVudCgpLmVxdWFscyhzZW1hbnRpY0VsZW1lbnQpKSB7DQorCQkJCQlpZiAoaGludC5lcXVhbHMoY2hpbGRWaWV3LmdldFR5cGUoKSkpIHsNCisJCQkJCQlwZXJmZWN0TWF0Y2guYWRkKGNoaWxkVmlldyk7DQorCQkJCQkJLy8gYWN0dWFsbHksIGNhbiBzdG9wIGl0ZXJhdGlvbiBvdmVyIHZpZXcgY2hpbGRyZW4gaGVyZSwgYnV0DQorCQkJCQkJLy8gbWF5IHdhbnQgdG8gdXNlIG5vdCB0aGUgZmlyc3QgdmlldyBidXQgbGFzdCBvbmUgYXMgYSAncmVhbCcgbWF0Y2ggKHRoZSB3YXkgb3JpZ2luYWwgQ0VQIGRvZXMNCisJCQkJCQkvLyB3aXRoIGl0cyB0cmljayB3aXRoIHZpZXdUb1NlbWFudGljTWFwIGluc2lkZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuDQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHBlcmZlY3RNYXRjaC5zaXplKCkgPiAwKSB7DQorCQkJCWRlc2NyaXB0b3JzSXRlcmF0b3IucmVtb3ZlKCk7IC8vIHByZWNpc2UgbWF0Y2ggZm91bmQgbm8gbmVlZCB0byBjcmVhdGUgYW55dGhpbmcgZm9yIHRoZSBOb2RlRGVzY3JpcHRvcg0KKwkJCQkvLyB1c2Ugb25seSBvbmUgdmlldyAoZmlyc3Qgb3IgbGFzdD8pLCBrZWVwIHJlc3QgYXMgb3JwaGFuZWQgZm9yIGZ1cnRoZXIgY29uc2lkZXJhdGlvbg0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5yZW1vdmUocGVyZmVjdE1hdGNoLmdldEZpcnN0KCkpOw0KKwkJCX0NCisJCX0NCisJCS8vIHRob3NlIGxlZnQgaW4ga25vd25WaWV3Q2hpbGRyZW4gYXJlIHN1YmplY3QgdG8gcmVtb3ZhbCAtIHRoZXkgYXJlIG91ciBkaWFncmFtIGVsZW1lbnRzIHdlIGRpZG4ndCBmaW5kIG1hdGNoIHRvLA0KKwkJLy8gb3IgdGhvc2Ugd2UgaGF2ZSBwb3RlbnRpYWwgbWF0Y2hlcyB0bywgYW5kIHRodXMgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHByZXNlcnZpbmcgc2l6ZS9sb2NhdGlvbiBpbmZvcm1hdGlvbi4NCisJCW9ycGhhbmVkLmFkZEFsbChrbm93blZpZXdDaGlsZHJlbik7DQorCQkvLw0KKwkJQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPiB2aWV3RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yPigNCisJCQkJY2hpbGREZXNjcmlwdG9ycy5zaXplKCkpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0IDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJSUFkYXB0YWJsZSBlbGVtZW50QWRhcHRlciA9IG5ldyBDYW5vbmljYWxFbGVtZW50QWRhcHRlcigNCisJCQkJCW5leHQuZ2V0TW9kZWxFbGVtZW50KCksIGhpbnQpOw0KKwkJCUNyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IoDQorCQkJCQllbGVtZW50QWRhcHRlciwgTm9kZS5jbGFzcywgaGludCwgVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwNCisJCQkJCWhvc3QoKS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOw0KKwkJCXZpZXdEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7DQorCQl9DQorDQorCQlib29sZWFuIGNoYW5nZWQgPSBkZWxldGVWaWV3cyhvcnBoYW5lZC5pdGVyYXRvcigpKTsNCisJCS8vDQorCQlDcmVhdGVWaWV3UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlVmlld1JlcXVlc3Qodmlld0Rlc2NyaXB0b3JzKTsNCisJCUNvbW1hbmQgY21kID0gZ2V0Q3JlYXRlVmlld0NvbW1hbmQocmVxdWVzdCk7DQorCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgew0KKwkJCVNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZC5tYWtlTXV0YWJsZSgNCisJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihob3N0KCkuZ2V0Tm90YXRpb25WaWV3KCkpKS5leGVjdXRlKCk7DQorCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsNCisJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJCQlMaXN0PElBZGFwdGFibGU+IG5sID0gKExpc3Q8SUFkYXB0YWJsZT4pIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCk7DQorCQkJY3JlYXRlZFZpZXdzLmFkZEFsbChubCk7DQorCQl9DQorCQlpZiAoY2hhbmdlZCB8fCBjcmVhdGVkVmlld3Muc2l6ZSgpID4gMCkgew0KKwkJCXBvc3RQcm9jZXNzUmVmcmVzaFNlbWFudGljKGNyZWF0ZWRWaWV3cyk7DQorCQl9DQorCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsNCisJCQkvLyBwZXJmb3JtIGEgbGF5b3V0IG9mIHRoZSBjb250YWluZXINCisJCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkNCisJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsNCisJCQlleGVjdXRlQ29tbWFuZChuZXcgSUNvbW1hbmRQcm94eShsYXlvdXRDbWQpKTsNCisJCX0NCisNCisJCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzY2YzMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuTXVsdGlGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2luZ2xlRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGaWx0ZXJVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDb21yZWxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8yMDA0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZTgxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeQ0KKwkJZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZVRvU3luY2hyb25pemUoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9IZWxwZXJVbml0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDlTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsNCisJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgPT0gbnVsbCkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCUxpbmtlZExpc3Q8SUFkYXB0YWJsZT4gY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3Q8SUFkYXB0YWJsZT4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDlTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxYmY1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLk11bHRpRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5NdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSB7DQorCQlzdXBlcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsNCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTaW5nbGVGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgTXVsdGlGZWF0dXJlVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgU2luZ2xlRmlsdGVyVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZGQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDI4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMjhTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWVkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTI3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDQ0U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNDRTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTgyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNTQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTRhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDQ2U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNDZTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjM5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNTkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Zjg2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDUwU2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNTBTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNWU1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWFjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDU2U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNTZTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTVkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODAyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5DQorCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlVG9TeW5jaHJvbml6ZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsNCisJCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsNCisJCUxpbmtlZExpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8RU9iamVjdD4oKTsNCisJCUxpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGNoaWxkRGVzY3JpcHRvcnMgPSBDb21yZWxEaWFncmFtVXBkYXRlcg0KKwkJCQkuZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDc4U2VtYW50aWNDaGlsZHJlbih2aWV3T2JqZWN0KTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgZCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlyZXN1bHQuYWRkKGQuZ2V0TW9kZWxFbGVtZW50KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNPcnBoYW5lZChDb2xsZWN0aW9uPEVPYmplY3Q+IHNlbWFudGljQ2hpbGRyZW4sDQorCQkJZmluYWwgVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gaXNNeURpYWdyYW1FbGVtZW50KHZpZXcpDQorCQkJCSYmICFzZW1hbnRpY0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcuZ2V0RWxlbWVudCgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzTXlEaWFncmFtRWxlbWVudChWaWV3IHZpZXcpIHsNCisJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQlzd2l0Y2ggKHZpc3VhbElEKSB7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgew0KKwkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxJQWRhcHRhYmxlPiBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdDxJQWRhcHRhYmxlPigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNzhTZW1hbnRpY0NoaWxkcmVuKChWaWV3KSBnZXRIb3N0KCkNCisJCQkJCQkuZ2V0TW9kZWwoKSk7DQorCQlMaW5rZWRMaXN0PFZpZXc+IG9ycGhhbmVkID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCS8vIHdlIGNhcmUgdG8gY2hlY2sgb25seSB2aWV3cyB3ZSByZWNvZ25pemUgYXMgb3Vycw0KKwkJTGlua2VkTGlzdDxWaWV3PiBrbm93blZpZXdDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7DQorCQlmb3IgKFZpZXcgdiA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJaWYgKGlzTXlEaWFncmFtRWxlbWVudCh2KSkgew0KKwkJCQlrbm93blZpZXdDaGlsZHJlbi5hZGQodik7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gYWx0ZXJuYXRpdmUgdG8gI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbihnZXRWaWV3Q2hpbGRyZW4oKSwgc2VtYW50aWNDaGlsZHJlbikNCisJCS8vDQorCQkvLyBpdGVyYXRpb24gaGFwcGVucyBvdmVyIGxpc3Qgb2YgZGVzaXJlZCBzZW1hbnRpYyBlbGVtZW50cywgdHJ5aW5nIHRvIGZpbmQgYmVzdCBtYXRjaGluZyBWaWV3LCB3aGlsZSBvcmlnaW5hbCBDRVANCisJCS8vIGl0ZXJhdGVzIHZpZXdzLCBwb3RlbnRpYWxseSBsb3NpbmcgdmlldyAoc2l6ZS9ib3VuZHMpIGluZm9ybWF0aW9uIC0gaS5lLiBpZiB0aGVyZSBhcmUgZmV3IHZpZXdzIHRvIHJlZmVyZW5jZSBzYW1lIEVPYmplY3QsIG9ubHkgbGFzdCBvbmUgDQorCQkvLyB0byBhbnN3ZXIgaXNPcnBoYW5lZCA9PSB0cnVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGRvbWFpbiBlbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzZWUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbigpDQorCQlmb3IgKEl0ZXJhdG9yPENvbXJlbE5vZGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0l0ZXJhdG9yID0gY2hpbGREZXNjcmlwdG9ycw0KKwkJCQkuaXRlcmF0b3IoKTsgZGVzY3JpcHRvcnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorCQkJQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA9IGRlc2NyaXB0b3JzSXRlcmF0b3IubmV4dCgpOw0KKwkJCVN0cmluZyBoaW50ID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKG5leHQuZ2V0VmlzdWFsSUQoKSk7DQorCQkJTGlua2VkTGlzdDxWaWV3PiBwZXJmZWN0TWF0Y2ggPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOyAvLyBib3RoIHNlbWFudGljRWxlbWVudCBhbmQgaGludCBtYXRjaCB0aGF0IG9mIE5vZGVEZXNjcmlwdG9yDQorCQkJZm9yIChWaWV3IGNoaWxkVmlldyA6IGdldFZpZXdDaGlsZHJlbigpKSB7DQorCQkJCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gY2hpbGRWaWV3LmdldEVsZW1lbnQoKTsNCisJCQkJaWYgKG5leHQuZ2V0TW9kZWxFbGVtZW50KCkuZXF1YWxzKHNlbWFudGljRWxlbWVudCkpIHsNCisJCQkJCWlmIChoaW50LmVxdWFscyhjaGlsZFZpZXcuZ2V0VHlwZSgpKSkgew0KKwkJCQkJCXBlcmZlY3RNYXRjaC5hZGQoY2hpbGRWaWV3KTsNCisJCQkJCQkvLyBhY3R1YWxseSwgY2FuIHN0b3AgaXRlcmF0aW9uIG92ZXIgdmlldyBjaGlsZHJlbiBoZXJlLCBidXQNCisJCQkJCQkvLyBtYXkgd2FudCB0byB1c2Ugbm90IHRoZSBmaXJzdCB2aWV3IGJ1dCBsYXN0IG9uZSBhcyBhICdyZWFsJyBtYXRjaCAodGhlIHdheSBvcmlnaW5hbCBDRVAgZG9lcw0KKwkJCQkJCS8vIHdpdGggaXRzIHRyaWNrIHdpdGggdmlld1RvU2VtYW50aWNNYXAgaW5zaWRlICNjbGVhbkNhbm9uaWNhbFNlbWFudGljQ2hpbGRyZW4NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAocGVyZmVjdE1hdGNoLnNpemUoKSA+IDApIHsNCisJCQkJZGVzY3JpcHRvcnNJdGVyYXRvci5yZW1vdmUoKTsgLy8gcHJlY2lzZSBtYXRjaCBmb3VuZCBubyBuZWVkIHRvIGNyZWF0ZSBhbnl0aGluZyBmb3IgdGhlIE5vZGVEZXNjcmlwdG9yDQorCQkJCS8vIHVzZSBvbmx5IG9uZSB2aWV3IChmaXJzdCBvciBsYXN0PyksIGtlZXAgcmVzdCBhcyBvcnBoYW5lZCBmb3IgZnVydGhlciBjb25zaWRlcmF0aW9uDQorCQkJCWtub3duVmlld0NoaWxkcmVuLnJlbW92ZShwZXJmZWN0TWF0Y2guZ2V0Rmlyc3QoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gdGhvc2UgbGVmdCBpbiBrbm93blZpZXdDaGlsZHJlbiBhcmUgc3ViamVjdCB0byByZW1vdmFsIC0gdGhleSBhcmUgb3VyIGRpYWdyYW0gZWxlbWVudHMgd2UgZGlkbid0IGZpbmQgbWF0Y2ggdG8sDQorCQkvLyBvciB0aG9zZSB3ZSBoYXZlIHBvdGVudGlhbCBtYXRjaGVzIHRvLCBhbmQgdGh1cyBuZWVkIHRvIGJlIHJlY3JlYXRlZCwgcHJlc2VydmluZyBzaXplL2xvY2F0aW9uIGluZm9ybWF0aW9uLg0KKwkJb3JwaGFuZWQuYWRkQWxsKGtub3duVmlld0NoaWxkcmVuKTsNCisJCS8vDQorCQlBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+IHZpZXdEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3I+KA0KKwkJCQljaGlsZERlc2NyaXB0b3JzLnNpemUoKSk7DQorCQlmb3IgKENvbXJlbE5vZGVEZXNjcmlwdG9yIG5leHQgOiBjaGlsZERlc2NyaXB0b3JzKSB7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlJQWRhcHRhYmxlIGVsZW1lbnRBZGFwdGVyID0gbmV3IENhbm9uaWNhbEVsZW1lbnRBZGFwdGVyKA0KKwkJCQkJbmV4dC5nZXRNb2RlbEVsZW1lbnQoKSwgaGludCk7DQorCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcigNCisJCQkJCWVsZW1lbnRBZGFwdGVyLCBOb2RlLmNsYXNzLCBoaW50LCBWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLA0KKwkJCQkJaG9zdCgpLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7DQorCQkJdmlld0Rlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsNCisJCX0NCisNCisJCWJvb2xlYW4gY2hhbmdlZCA9IGRlbGV0ZVZpZXdzKG9ycGhhbmVkLml0ZXJhdG9yKCkpOw0KKwkJLy8NCisJCUNyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QgPSBnZXRDcmVhdGVWaWV3UmVxdWVzdCh2aWV3RGVzY3JpcHRvcnMpOw0KKwkJQ29tbWFuZCBjbWQgPSBnZXRDcmVhdGVWaWV3Q29tbWFuZChyZXF1ZXN0KTsNCisJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7DQorCQkJU2V0Vmlld011dGFiaWxpdHlDb21tYW5kLm1ha2VNdXRhYmxlKA0KKwkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGhvc3QoKS5nZXROb3RhdGlvblZpZXcoKSkpLmV4ZWN1dGUoKTsNCisJCQlleGVjdXRlQ29tbWFuZChjbWQpOw0KKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwkJCUxpc3Q8SUFkYXB0YWJsZT4gbmwgPSAoTGlzdDxJQWRhcHRhYmxlPikgcmVxdWVzdC5nZXROZXdPYmplY3QoKTsNCisJCQljcmVhdGVkVmlld3MuYWRkQWxsKG5sKTsNCisJCX0NCisJCWlmIChjaGFuZ2VkIHx8IGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAwKSB7DQorCQkJcG9zdFByb2Nlc3NSZWZyZXNoU2VtYW50aWMoY3JlYXRlZFZpZXdzKTsNCisJCX0NCisJCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgew0KKwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcg0KKwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQ0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOw0KKwkJfQ0KKw0KKwkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmQyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuUGFyYWxsZWxRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuU2VxdWVudGlhbFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TaW5nbGVRdWV1ZWRVbml0NUNyZWF0ZUNvbW1hbmQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzIwMDQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGFjMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9lZGl0L3BvbGljaWVzL1NpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5lZGl0LnBvbGljaWVzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldFZpZXdNdXRhYmlsaXR5Q29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtVXBkYXRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxOb2RlRGVzY3JpcHRvcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kNCisJCWV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVUb1N5bmNocm9uaXplKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgew0KKwkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOw0KKwkJTGlua2VkTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxFT2JqZWN0PigpOw0KKwkJTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gY2hpbGREZXNjcmlwdG9ycyA9IENvbXJlbERpYWdyYW1VcGRhdGVyDQorCQkJCS5nZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMTBTZW1hbnRpY0NoaWxkcmVuKHZpZXdPYmplY3QpOw0KKwkJZm9yIChDb21yZWxOb2RlRGVzY3JpcHRvciBkIDogY2hpbGREZXNjcmlwdG9ycykgew0KKwkJCXJlc3VsdC5hZGQoZC5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ycGhhbmVkKENvbGxlY3Rpb248RU9iamVjdD4gc2VtYW50aWNDaGlsZHJlbiwNCisJCQlmaW5hbCBWaWV3IHZpZXcpIHsNCisJCXJldHVybiBpc015RGlhZ3JhbUVsZW1lbnQodmlldykNCisJCQkJJiYgIXNlbWFudGljQ2hpbGRyZW4uY29udGFpbnModmlldy5nZXRFbGVtZW50KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNNeURpYWdyYW1FbGVtZW50KFZpZXcgdmlldykgew0KKwkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQljYXNlIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7DQorCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlMaW5rZWRMaXN0PElBZGFwdGFibGU+IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0PElBZGFwdGFibGU+KCk7DQorCQlMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBjaGlsZERlc2NyaXB0b3JzID0gQ29tcmVsRGlhZ3JhbVVwZGF0ZXINCisJCQkJLmdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAxMFNlbWFudGljQ2hpbGRyZW4oKFZpZXcpIGdldEhvc3QoKQ0KKwkJCQkJCS5nZXRNb2RlbCgpKTsNCisJCUxpbmtlZExpc3Q8Vmlldz4gb3JwaGFuZWQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJLy8gd2UgY2FyZSB0byBjaGVjayBvbmx5IHZpZXdzIHdlIHJlY29nbml6ZSBhcyBvdXJzDQorCQlMaW5rZWRMaXN0PFZpZXc+IGtub3duVmlld0NoaWxkcmVuID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyB2IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQlpZiAoaXNNeURpYWdyYW1FbGVtZW50KHYpKSB7DQorCQkJCWtub3duVmlld0NoaWxkcmVuLmFkZCh2KTsNCisJCQl9DQorCQl9DQorCQkvLyBhbHRlcm5hdGl2ZSB0byAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKGdldFZpZXdDaGlsZHJlbigpLCBzZW1hbnRpY0NoaWxkcmVuKQ0KKwkJLy8NCisJCS8vIGl0ZXJhdGlvbiBoYXBwZW5zIG92ZXIgbGlzdCBvZiBkZXNpcmVkIHNlbWFudGljIGVsZW1lbnRzLCB0cnlpbmcgdG8gZmluZCBiZXN0IG1hdGNoaW5nIFZpZXcsIHdoaWxlIG9yaWdpbmFsIENFUA0KKwkJLy8gaXRlcmF0ZXMgdmlld3MsIHBvdGVudGlhbGx5IGxvc2luZyB2aWV3IChzaXplL2JvdW5kcykgaW5mb3JtYXRpb24gLSBpLmUuIGlmIHRoZXJlIGFyZSBmZXcgdmlld3MgdG8gcmVmZXJlbmNlIHNhbWUgRU9iamVjdCwgb25seSBsYXN0IG9uZSANCisJCS8vIHRvIGFuc3dlciBpc09ycGhhbmVkID09IHRydWUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZG9tYWluIGVsZW1lbnQgcmVwcmVzZW50YXRpb24sIHNlZSAjY2xlYW5DYW5vbmljYWxTZW1hbnRpY0NoaWxkcmVuKCkNCisJCWZvciAoSXRlcmF0b3I8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGRlc2NyaXB0b3JzSXRlcmF0b3IgPSBjaGlsZERlc2NyaXB0b3JzDQorCQkJCS5pdGVyYXRvcigpOyBkZXNjcmlwdG9yc0l0ZXJhdG9yLmhhc05leHQoKTspIHsNCisJCQlDb21yZWxOb2RlRGVzY3JpcHRvciBuZXh0ID0gZGVzY3JpcHRvcnNJdGVyYXRvci5uZXh0KCk7DQorCQkJU3RyaW5nIGhpbnQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUobmV4dC5nZXRWaXN1YWxJRCgpKTsNCisJCQlMaW5rZWRMaXN0PFZpZXc+IHBlcmZlY3RNYXRjaCA9IG5ldyBMaW5rZWRMaXN0PFZpZXc+KCk7IC8vIGJvdGggc2VtYW50aWNFbGVtZW50IGFuZCBoaW50IG1hdGNoIHRoYXQgb2YgTm9kZURlc2NyaXB0b3INCisJCQlmb3IgKFZpZXcgY2hpbGRWaWV3IDogZ2V0Vmlld0NoaWxkcmVuKCkpIHsNCisJCQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBjaGlsZFZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCQlpZiAobmV4dC5nZXRNb2RlbEVsZW1lbnQoKS5lcXVhbHMoc2VtYW50aWNFbGVtZW50KSkgew0KKwkJCQkJaWYgKGhpbnQuZXF1YWxzKGNoaWxkVmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCQkJcGVyZmVjdE1hdGNoLmFkZChjaGlsZFZpZXcpOw0KKwkJCQkJCS8vIGFjdHVhbGx5LCBjYW4gc3RvcCBpdGVyYXRpb24gb3ZlciB2aWV3IGNoaWxkcmVuIGhlcmUsIGJ1dA0KKwkJCQkJCS8vIG1heSB3YW50IHRvIHVzZSBub3QgdGhlIGZpcnN0IHZpZXcgYnV0IGxhc3Qgb25lIGFzIGEgJ3JlYWwnIG1hdGNoICh0aGUgd2F5IG9yaWdpbmFsIENFUCBkb2VzDQorCQkJCQkJLy8gd2l0aCBpdHMgdHJpY2sgd2l0aCB2aWV3VG9TZW1hbnRpY01hcCBpbnNpZGUgI2NsZWFuQ2Fub25pY2FsU2VtYW50aWNDaGlsZHJlbg0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChwZXJmZWN0TWF0Y2guc2l6ZSgpID4gMCkgew0KKwkJCQlkZXNjcmlwdG9yc0l0ZXJhdG9yLnJlbW92ZSgpOyAvLyBwcmVjaXNlIG1hdGNoIGZvdW5kIG5vIG5lZWQgdG8gY3JlYXRlIGFueXRoaW5nIGZvciB0aGUgTm9kZURlc2NyaXB0b3INCisJCQkJLy8gdXNlIG9ubHkgb25lIHZpZXcgKGZpcnN0IG9yIGxhc3Q/KSwga2VlcCByZXN0IGFzIG9ycGhhbmVkIGZvciBmdXJ0aGVyIGNvbnNpZGVyYXRpb24NCisJCQkJa25vd25WaWV3Q2hpbGRyZW4ucmVtb3ZlKHBlcmZlY3RNYXRjaC5nZXRGaXJzdCgpKTsNCisJCQl9DQorCQl9DQorCQkvLyB0aG9zZSBsZWZ0IGluIGtub3duVmlld0NoaWxkcmVuIGFyZSBzdWJqZWN0IHRvIHJlbW92YWwgLSB0aGV5IGFyZSBvdXIgZGlhZ3JhbSBlbGVtZW50cyB3ZSBkaWRuJ3QgZmluZCBtYXRjaCB0bywNCisJCS8vIG9yIHRob3NlIHdlIGhhdmUgcG90ZW50aWFsIG1hdGNoZXMgdG8sIGFuZCB0aHVzIG5lZWQgdG8gYmUgcmVjcmVhdGVkLCBwcmVzZXJ2aW5nIHNpemUvbG9jYXRpb24gaW5mb3JtYXRpb24uDQorCQlvcnBoYW5lZC5hZGRBbGwoa25vd25WaWV3Q2hpbGRyZW4pOw0KKwkJLy8NCisJCUFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4gdmlld0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcj4oDQorCQkJCWNoaWxkRGVzY3JpcHRvcnMuc2l6ZSgpKTsNCisJCWZvciAoQ29tcmVsTm9kZURlc2NyaXB0b3IgbmV4dCA6IGNoaWxkRGVzY3JpcHRvcnMpIHsNCisJCQlTdHJpbmcgaGludCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VHlwZShuZXh0LmdldFZpc3VhbElEKCkpOw0KKwkJCUlBZGFwdGFibGUgZWxlbWVudEFkYXB0ZXIgPSBuZXcgQ2Fub25pY2FsRWxlbWVudEFkYXB0ZXIoDQorCQkJCQluZXh0LmdldE1vZGVsRWxlbWVudCgpLCBoaW50KTsNCisJCQlDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZVZpZXdSZXF1ZXN0LlZpZXdEZXNjcmlwdG9yKA0KKwkJCQkJZWxlbWVudEFkYXB0ZXIsIE5vZGUuY2xhc3MsIGhpbnQsIFZpZXdVdGlsLkFQUEVORCwgZmFsc2UsDQorCQkJCQlob3N0KCkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsNCisJCQl2aWV3RGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOw0KKwkJfQ0KKw0KKwkJYm9vbGVhbiBjaGFuZ2VkID0gZGVsZXRlVmlld3Mob3JwaGFuZWQuaXRlcmF0b3IoKSk7DQorCQkvLw0KKwkJQ3JlYXRlVmlld1JlcXVlc3QgcmVxdWVzdCA9IGdldENyZWF0ZVZpZXdSZXF1ZXN0KHZpZXdEZXNjcmlwdG9ycyk7DQorCQlDb21tYW5kIGNtZCA9IGdldENyZWF0ZVZpZXdDb21tYW5kKHJlcXVlc3QpOw0KKwkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsNCisJCQlTZXRWaWV3TXV0YWJpbGl0eUNvbW1hbmQubWFrZU11dGFibGUoDQorCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoaG9zdCgpLmdldE5vdGF0aW9uVmlldygpKSkuZXhlY3V0ZSgpOw0KKwkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7DQorCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQkJTGlzdDxJQWRhcHRhYmxlPiBubCA9IChMaXN0PElBZGFwdGFibGU+KSByZXF1ZXN0LmdldE5ld09iamVjdCgpOw0KKwkJCWNyZWF0ZWRWaWV3cy5hZGRBbGwobmwpOw0KKwkJfQ0KKwkJaWYgKGNoYW5nZWQgfHwgY3JlYXRlZFZpZXdzLnNpemUoKSA+IDApIHsNCisJCQlwb3N0UHJvY2Vzc1JlZnJlc2hTZW1hbnRpYyhjcmVhdGVkVmlld3MpOw0KKwkJfQ0KKwkJaWYgKGNyZWF0ZWRWaWV3cy5zaXplKCkgPiAxKSB7DQorCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyDQorCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpDQorCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLCBjcmVhdGVkVmlld3MsIGhvc3QoKSk7DQorCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7DQorCQl9DQorDQorCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZWRpdC9wb2xpY2llcy9TaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYjM5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2VkaXQvcG9saWNpZXMvU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0uZWRpdC5wb2xpY2llczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQuY29tbWFuZHMuQXRvbWljVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5Db25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5QYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5jb21tYW5kcy5TZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LmNvbW1hbmRzLlNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5DQorCQlleHRlbmRzIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpIHsNCisJCXN1cGVyKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwMjIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgew0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsNCisJCQlyZXR1cm4gZ2V0R0VGV3JhcHBlcihuZXcgQ2FydGVzaWFuUXVldWVkVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IFNpbmdsZVF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBTZXF1ZW50aWFsVW5pdDRDcmVhdGVDb21tYW5kKHJlcSkpOw0KKwkJfQ0KKwkJaWYgKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2NiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgew0KKwkJCXJldHVybiBnZXRHRUZXcmFwcGVyKG5ldyBDb25kaXRpb25hbFVuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7DQorCQkJcmV0dXJuIGdldEdFRldyYXBwZXIobmV3IEF0b21pY1VuaXQ0Q3JlYXRlQ29tbWFuZChyZXEpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9leHByZXNzaW9ucy9Db21yZWxBYnN0cmFjdEV4cHJlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZXhwcmVzc2lvbnMvQ29tcmVsQWJzdHJhY3RFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYzM5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vZXhwcmVzc2lvbnMvQ29tcmVsQWJzdHJhY3RFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5leHByZXNzaW9uczsNCisNCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7DQoraW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21yZWxBYnN0cmFjdEV4cHJlc3Npb24gew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXRTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgew0KKwkJU3RyaW5nIHBsdWdpbklEID0gQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRDsNCisJCXRoaXMuc3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgcGx1Z2luSUQsIC0xLA0KKwkJCQkobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIiwgdGhyb3dhYmxlKTsgLy8kTk9OLU5MUy0xJA0KKwkJaWYgKCF0aGlzLnN0YXR1cy5pc09LKCkpIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luDQorCQkJCQkuZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJLmxvZ0Vycm9yKA0KKwkJCQkJCQkiRXhwcmVzc2lvbiBwcm9ibGVtOiIgKyBtZXNzYWdlICsgImJvZHk6IiArIGJvZHkoKSwgdGhyb3dhYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsNCisJCXJldHVybiBzdGF0dXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgU3RyaW5nIG15Qm9keTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgYm9keSgpIHsNCisJCXJldHVybiBteUJvZHk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgRUNsYXNzaWZpZXIgbXlDb250ZXh0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzc2lmaWVyIGNvbnRleHQoKSB7DQorCQlyZXR1cm4gbXlDb250ZXh0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcmVsQWJzdHJhY3RFeHByZXNzaW9uKFN0cmluZyBib2R5LCBFQ2xhc3NpZmllciBjb250ZXh0KSB7DQorCQlteUJvZHkgPSBib2R5Ow0KKwkJbXlDb250ZXh0ID0gY29udGV4dDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPYmplY3QgZXZhbHVhdGUoT2JqZWN0IGNvbnRleHQpIHsNCisJCXJldHVybiBldmFsdWF0ZShjb250ZXh0LCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQ0KKwlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7DQorCQlpZiAoY29udGV4dCgpLmlzSW5zdGFuY2UoY29udGV4dCkpIHsNCisJCQl0cnkgew0KKwkJCQlyZXR1cm4gZG9FdmFsdWF0ZShjb250ZXh0LCBlbnYpOw0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCQkiRXhwcmVzc2lvbiBldmFsdWF0aW9uIGZhaWx1cmU6ICIgKyBib2R5KCksIGUpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEV4cHJlc3Npb24gbWF5IHJldHVybiBudW1iZXIgdmFsdWUgd2hpY2ggaXMgbm90IGRpcmVjdGx5IGNvbXBhdGlibGUgd2l0aCBmZWF0dXJlIHR5cGUgKGUuZy4gRG91YmxlIHdoZW4gSW50ZWdlciBpcyBleHBlY3RlZCksIG9yIEVFbnVtTGl0ZXJhbCBtZXRhLW9iamVjdCB3aGVuIGxpdGVyYWwgaW5zdGFuY2UgaXMgZXhwZWN0ZWQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBPYmplY3QgcGVyZm9ybUNhc3QoT2JqZWN0IHZhbHVlLCBFRGF0YVR5cGUgdGFyZ2V0VHlwZSkgew0KKwkJaWYgKHRhcmdldFR5cGUgaW5zdGFuY2VvZiBFRW51bSkgew0KKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEVFbnVtTGl0ZXJhbCkgew0KKwkJCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9IChFRW51bUxpdGVyYWwpIHZhbHVlOw0KKwkJCQlyZXR1cm4gKGxpdGVyYWwuZ2V0SW5zdGFuY2UoKSAhPSBudWxsKSA/IGxpdGVyYWwuZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJCTogbGl0ZXJhbDsNCisJCQl9DQorCQl9DQorCQlpZiAoZmFsc2UgPT0gdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdGFyZ2V0VHlwZSA9PSBudWxsDQorCQkJCXx8IHRhcmdldFR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpID09IG51bGwpIHsNCisJCQlyZXR1cm4gdmFsdWU7DQorCQl9DQorCQlDbGFzczw/PiB0YXJnZXRDbGFzcyA9IHRhcmdldFR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOw0KKwkJTnVtYmVyIG51bSA9IChOdW1iZXIpIHZhbHVlOw0KKwkJQ2xhc3M8Pz4gdmFsQ2xhc3MgPSB2YWx1ZS5nZXRDbGFzcygpOw0KKwkJQ2xhc3M8Pz4gdGFyZ2V0V3JhcHBlckNsYXNzID0gdGFyZ2V0Q2xhc3M7DQorCQlpZiAodGFyZ2V0Q2xhc3MuaXNQcmltaXRpdmUoKSkgew0KKwkJCXRhcmdldFdyYXBwZXJDbGFzcyA9IEVjb3JlVXRpbC53cmFwcGVyQ2xhc3NGb3IodGFyZ2V0Q2xhc3MpOw0KKwkJfQ0KKwkJaWYgKHZhbENsYXNzLmVxdWFscyh0YXJnZXRXcmFwcGVyQ2xhc3MpKSB7DQorCQkJcmV0dXJuIHZhbHVlOw0KKwkJfQ0KKwkJaWYgKE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhcmdldFdyYXBwZXJDbGFzcykpIHsNCisJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhCeXRlLmNsYXNzKSkNCisJCQkJcmV0dXJuIG5ldyBCeXRlKG51bS5ieXRlVmFsdWUoKSk7DQorCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoSW50ZWdlci5jbGFzcykpDQorCQkJCXJldHVybiBuZXcgSW50ZWdlcihudW0uaW50VmFsdWUoKSk7DQorCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoU2hvcnQuY2xhc3MpKQ0KKwkJCQlyZXR1cm4gbmV3IFNob3J0KG51bS5zaG9ydFZhbHVlKCkpOw0KKwkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKExvbmcuY2xhc3MpKQ0KKwkJCQlyZXR1cm4gbmV3IExvbmcobnVtLmxvbmdWYWx1ZSgpKTsNCisJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhCaWdJbnRlZ2VyLmNsYXNzKSkNCisJCQkJcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihudW0ubG9uZ1ZhbHVlKCkpOw0KKwkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEZsb2F0LmNsYXNzKSkNCisJCQkJcmV0dXJuIG5ldyBGbG9hdChudW0uZmxvYXRWYWx1ZSgpKTsNCisJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhEb3VibGUuY2xhc3MpKQ0KKwkJCQlyZXR1cm4gbmV3IERvdWJsZShudW0uZG91YmxlVmFsdWUoKSk7DQorCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoQmlnRGVjaW1hbC5jbGFzcykpDQorCQkJCXJldHVybiBuZXcgQmlnRGVjaW1hbChudW0uZG91YmxlVmFsdWUoKSk7DQorCQl9DQorCQlyZXR1cm4gdmFsdWU7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9leHByZXNzaW9ucy9Db21yZWxPQ0xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2V4cHJlc3Npb25zL0NvbXJlbE9DTEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRmMTFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9leHByZXNzaW9ucy9Db21yZWxPQ0xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5leHByZXNzaW9uczsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uub2NsLkVudmlyb25tZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vY2wuRXZhbHVhdGlvbkVudmlyb25tZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vY2wuUGFyc2VyRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vY2wuZWNvcmUuRWNvcmVGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vY2wuZWNvcmUuT0NMRXhwcmVzc2lvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uub2NsLmVjb3JlLlZhcmlhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vY2wuZWNvcmUuT0NMLkhlbHBlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uub2NsLm9wdGlvbnMuUGFyc2luZ09wdGlvbnM7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbE9DTEZhY3Rvcnkgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBmaW5hbCBDb21yZWxBYnN0cmFjdEV4cHJlc3Npb25bXSBleHByZXNzaW9uczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21yZWxPQ0xGYWN0b3J5KCkgew0KKwkJdGhpcy5leHByZXNzaW9ucyA9IG5ldyBDb21yZWxBYnN0cmFjdEV4cHJlc3Npb25bM107DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29tcmVsQWJzdHJhY3RFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oaW50IGluZGV4LA0KKwkJCUVDbGFzc2lmaWVyIGNvbnRleHQsIE1hcDxTdHJpbmcsIEVDbGFzc2lmaWVyPiBlbnZpcm9ubWVudCkgew0KKwkJQ29tcmVsT0NMRmFjdG9yeSBjYWNoZWQgPSBDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkNCisJCQkJLmdldENvbXJlbE9DTEZhY3RvcnkoKTsNCisJCWlmIChjYWNoZWQgPT0gbnVsbCkgew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zZXRDb21yZWxPQ0xGYWN0b3J5KA0KKwkJCQkJY2FjaGVkID0gbmV3IENvbXJlbE9DTEZhY3RvcnkoKSk7DQorCQl9DQorCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGNhY2hlZC5leHByZXNzaW9ucy5sZW5ndGgpIHsNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorCQl9DQorCQlpZiAoY2FjaGVkLmV4cHJlc3Npb25zW2luZGV4XSA9PSBudWxsKSB7DQorCQkJZmluYWwgU3RyaW5nW10gZXhwckJvZGllcyA9IG5ldyBTdHJpbmdbXSB7ICJzZWxmPD5vcHBvc2l0ZUVuZCIsIC8vJE5PTi1OTFMtMSQNCisJCQkJCSJzZWxmPD5vcHBvc2l0ZUVuZCIsIC8vJE5PTi1OTFMtMSQNCisJCQkJCSJzZWxmPD5vcHBvc2l0ZUVuZCIsIC8vJE5PTi1OTFMtMSQNCisJCQl9Ow0KKwkJCWNhY2hlZC5leHByZXNzaW9uc1tpbmRleF0gPSBnZXRFeHByZXNzaW9uKA0KKwkJCQkJZXhwckJvZGllc1tpbmRleF0sDQorCQkJCQljb250ZXh0LA0KKwkJCQkJZW52aXJvbm1lbnQgPT0gbnVsbCA/IENvbGxlY3Rpb25zDQorCQkJCQkJCS48U3RyaW5nLCBFQ2xhc3NpZmllcj4gZW1wdHlNYXAoKSA6IGVudmlyb25tZW50KTsNCisJCX0NCisJCXJldHVybiBjYWNoZWQuZXhwcmVzc2lvbnNbaW5kZXhdOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIGZhY3RvcnkgbWV0aG9kLCBjYWxsZXJzIGFyZSByZXNwb25zaWJsZSB0byBrZWVwIHJlZmVyZW5jZSB0byB0aGUgcmV0dXJuIHZhbHVlIGlmIHRoZXkgd2FudCB0byByZXVzZSBwYXJzZWQgZXhwcmVzc2lvbg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIENvbXJlbEFic3RyYWN0RXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKFN0cmluZyBib2R5LA0KKwkJCUVDbGFzc2lmaWVyIGNvbnRleHQsIE1hcDxTdHJpbmcsIEVDbGFzc2lmaWVyPiBlbnZpcm9ubWVudCkgew0KKwkJcmV0dXJuIG5ldyBFeHByZXNzaW9uKGJvZHksIGNvbnRleHQsIGVudmlyb25tZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBtZXRob2Qgd2lsbCBiZWNvbWUgcHJpdmF0ZSBpbiB0aGUgbmV4dCByZWxlYXNlDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29tcmVsQWJzdHJhY3RFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oU3RyaW5nIGJvZHksDQorCQkJRUNsYXNzaWZpZXIgY29udGV4dCkgew0KKwkJcmV0dXJuIGdldEV4cHJlc3Npb24oYm9keSwgY29udGV4dCwNCisJCQkJQ29sbGVjdGlvbnMuPFN0cmluZywgRUNsYXNzaWZpZXI+IGVtcHR5TWFwKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgQ29tcmVsQWJzdHJhY3RFeHByZXNzaW9uIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLm9jbC5lY29yZS5PQ0wgb2NsSW5zdGFuY2U7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBPQ0xFeHByZXNzaW9uIG9jbEV4cHJlc3Npb247DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEV4cHJlc3Npb24oU3RyaW5nIGJvZHksIEVDbGFzc2lmaWVyIGNvbnRleHQsDQorCQkJCU1hcDxTdHJpbmcsIEVDbGFzc2lmaWVyPiBlbnZpcm9ubWVudCkgew0KKwkJCXN1cGVyKGJvZHksIGNvbnRleHQpOw0KKwkJCW9jbEluc3RhbmNlID0gb3JnLmVjbGlwc2Uub2NsLmVjb3JlLk9DTC5uZXdJbnN0YW5jZSgpOw0KKwkJCWluaXRDdXN0b21FbnYob2NsSW5zdGFuY2UuZ2V0RW52aXJvbm1lbnQoKSwgZW52aXJvbm1lbnQpOw0KKwkJCUhlbHBlciBvY2xIZWxwZXIgPSBvY2xJbnN0YW5jZS5jcmVhdGVPQ0xIZWxwZXIoKTsNCisJCQlvY2xIZWxwZXIuc2V0Q29udGV4dChjb250ZXh0KCkpOw0KKwkJCXRyeSB7DQorCQkJCW9jbEV4cHJlc3Npb24gPSBvY2xIZWxwZXIuY3JlYXRlUXVlcnkoYm9keSgpKTsNCisJCQkJc2V0U3RhdHVzKElTdGF0dXMuT0ssIG51bGwsIG51bGwpOw0KKwkJCX0gY2F0Y2ggKFBhcnNlckV4Y2VwdGlvbiBlKSB7DQorCQkJCXNldFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSwgZSk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsNCisJCQlpZiAob2NsRXhwcmVzc2lvbiA9PSBudWxsKSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCQkvLyBvbiB0aGUgZmlyc3QgY2FsbCwgYm90aCBldmFsRW52aXJvbm1lbnQgYW5kIGV4dGVudE1hcCBhcmUgY2xlYXIsIGZvciBsYXRlciB3ZSBoYXZlIGZpbmFsbHksIGJlbG93Lg0KKwkJCUV2YWx1YXRpb25FbnZpcm9ubWVudDw/LCA/LCA/LCA/LCA/PiBldmFsRW52ID0gb2NsSW5zdGFuY2UNCisJCQkJCS5nZXRFdmFsdWF0aW9uRW52aXJvbm1lbnQoKTsNCisJCQkvLyBpbml0aWFsaXplIGVudmlyb25tZW50DQorCQkJZm9yIChPYmplY3QgbmV4dEtleSA6IGVudi5rZXlTZXQoKSkgew0KKwkJCQlldmFsRW52LnJlcGxhY2UoKFN0cmluZykgbmV4dEtleSwgZW52LmdldChuZXh0S2V5KSk7DQorCQkJfQ0KKwkJCXRyeSB7DQorCQkJCU9iamVjdCByZXN1bHQgPSBvY2xJbnN0YW5jZS5ldmFsdWF0ZShjb250ZXh0LCBvY2xFeHByZXNzaW9uKTsNCisJCQkJcmV0dXJuIG9jbEluc3RhbmNlLmlzSW52YWxpZChyZXN1bHQpID8gbnVsbCA6IHJlc3VsdDsNCisJCQl9IGZpbmFsbHkgew0KKwkJCQlldmFsRW52LmNsZWFyKCk7DQorCQkJCW9jbEluc3RhbmNlLnNldEV4dGVudE1hcChudWxsKTsgLy8gY2xlYXIgYWxsSW5zdGFuY2VzIGNhY2hlLCBhbmQgZ2V0IHRoZSBvY2xJbnN0YW5jZSByZWFkeSBmb3IgdGhlIG5leHQgY2FsbA0KKwkJCX0NCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRDdXN0b21FbnYoDQorCQkJCUVudmlyb25tZW50PD8sIEVDbGFzc2lmaWVyLCA/LCA/LCA/LCBFUGFyYW1ldGVyLCA/LCA/LCA/LCA/LCA/LCA/PiBlY29yZUVudiwNCisJCQkJTWFwPFN0cmluZywgRUNsYXNzaWZpZXI+IGVudmlyb25tZW50KSB7DQorCQkJLy8gVXNlIEVPYmplY3QgYXMgaW1wbGljaXQgcm9vdCBjbGFzcyBmb3IgYW55IG9iamVjdCwgdG8gYWxsb3cgZUNvbnRhaW5lcigpIGFuZCBvdGhlciBFT2JqZWN0IG9wZXJhdGlvbnMgZnJvbSBPQ0wgZXhwcmVzc2lvbnMNCisJCQlQYXJzaW5nT3B0aW9ucy5zZXRPcHRpb24oZWNvcmVFbnYsDQorCQkJCQlQYXJzaW5nT3B0aW9ucy5pbXBsaWNpdFJvb3RDbGFzcyhlY29yZUVudiksDQorCQkJCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVPYmplY3QoKSk7DQorCQkJZm9yIChTdHJpbmcgdmFyTmFtZSA6IGVudmlyb25tZW50LmtleVNldCgpKSB7DQorCQkJCUVDbGFzc2lmaWVyIHZhclR5cGUgPSBlbnZpcm9ubWVudC5nZXQodmFyTmFtZSk7DQorCQkJCWVjb3JlRW52LmFkZEVsZW1lbnQodmFyTmFtZSwNCisJCQkJCQljcmVhdGVWYXIoZWNvcmVFbnYsIHZhck5hbWUsIHZhclR5cGUpLCBmYWxzZSk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgc3RhdGljIFZhcmlhYmxlIGNyZWF0ZVZhcigNCisJCQkJRW52aXJvbm1lbnQ8PywgRUNsYXNzaWZpZXIsID8sID8sID8sID8sID8sID8sID8sID8sID8sID8+IGVjb3JlRW52LA0KKwkJCQlTdHJpbmcgbmFtZSwgRUNsYXNzaWZpZXIgdHlwZSkgew0KKwkJCVZhcmlhYmxlIHZhciA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVmFyaWFibGUoKTsNCisJCQl2YXIuc2V0TmFtZShuYW1lKTsNCisJCQl2YXIuc2V0VHlwZShlY29yZUVudi5nZXRVTUxSZWZsZWN0aW9uKCkuZ2V0T0NMVHlwZSh0eXBlKSk7DQorCQkJcmV0dXJuIHZhcjsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2xheW91dHByb3ZpZGVyL0NvbXBvc2l0ZVJlZmFjdG9yaW5nRGVmYXVsdExheW91dFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL2xheW91dHByb3ZpZGVyL0NvbXBvc2l0ZVJlZmFjdG9yaW5nRGVmYXVsdExheW91dFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0Yjg3MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbGF5b3V0cHJvdmlkZXIvQ29tcG9zaXRlUmVmYWN0b3JpbmdEZWZhdWx0TGF5b3V0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLmxheW91dHByb3ZpZGVyOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkxlZnRSaWdodFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmxheW91dC5JTGF5b3V0Tm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5sYXlvdXQuSUxheW91dE5vZGVPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMubGF5b3V0LkxheW91dFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQorcHVibGljIGNsYXNzIENvbXBvc2l0ZVJlZmFjdG9yaW5nRGVmYXVsdExheW91dFByb3ZpZGVyIGV4dGVuZHMgTGVmdFJpZ2h0UHJvdmlkZXIgew0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX0xBWU9VVCA9ICJEZWZhdWx0IjsNCisNCisgICAgcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsNCisgICAgICAgIC8vIGVuYWJsZSB0aGlzIHByb3ZpZGVyIG9ubHkgb24gbWluZG1hcCBkaWFncmFtcw0KKyAgICAgICAgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIElMYXlvdXROb2RlT3BlcmF0aW9uKSB7DQorICAgICAgICAgICAgSXRlcmF0b3Igbm9kZXMgPSAoKElMYXlvdXROb2RlT3BlcmF0aW9uKSBvcGVyYXRpb24pDQorICAgICAgICAgICAgICAgIC5nZXRMYXlvdXROb2RlcygpLmxpc3RJdGVyYXRvcigpOw0KKyAgICAgICAgICAgIGlmIChub2Rlcy5oYXNOZXh0KCkpIHsNCisgICAgICAgICAgICAgICAgVmlldyBub2RlID0gKChJTGF5b3V0Tm9kZSkgbm9kZXMubmV4dCgpKS5nZXROb2RlKCk7DQorICAgICAgICAgICAgICAgIERpYWdyYW0gY29udGFpbmVyID0gbm9kZS5nZXREaWFncmFtKCk7DQorICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbA0KKyAgICAgICAgICAgICAgICAgICAgfHwgIShjb250YWluZXIuZ2V0VHlwZSgpLmVxdWFscygiTWluZG1hcCIpKSkgLy8kTk9OLU5MUy0xJA0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgSUFkYXB0YWJsZSBsYXlvdXRIaW50ID0gKChJTGF5b3V0Tm9kZU9wZXJhdGlvbikgb3BlcmF0aW9uKQ0KKyAgICAgICAgICAgIC5nZXRMYXlvdXRIaW50KCk7DQorICAgICAgICBTdHJpbmcgbGF5b3V0VHlwZSA9IChTdHJpbmcpIGxheW91dEhpbnQuZ2V0QWRhcHRlcihTdHJpbmcuY2xhc3MpOw0KKyAgICAgICAgcmV0dXJuIExheW91dFR5cGUuREVGQVVMVC5lcXVhbHMobGF5b3V0VHlwZSk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDY3Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm1PYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtIGV4dGVuZHMgUGxhdGZvcm1PYmplY3Qgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCWZpbmFsIENsYXNzW10gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yLmNsYXNzIH07DQorCQlmaW5hbCBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciBwcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yID0gbmV3IElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKCkgew0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpIHsNCisJCQkJcmV0dXJuICJjb21yZWwuZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9Ow0KKwkJUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5yZWdpc3RlckFkYXB0ZXJzKG5ldyBJQWRhcHRlckZhY3RvcnkoKSB7DQorDQorCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7DQorCQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtDQorCQkJCQkJJiYgYWRhcHRlclR5cGUgPT0gSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IuY2xhc3MpIHsNCisJCQkJCXJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOw0KKwkJCQl9DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisNCisJCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsNCisJCQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzOw0KKwkJCX0NCisJCX0sIGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0uY2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIE9iamVjdCBteVBhcmVudDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0oT2JqZWN0IHBhcmVudCkgew0KKwkJbXlQYXJlbnQgPSBwYXJlbnQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgew0KKwkJcmV0dXJuIG15UGFyZW50Ow0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbERvbWFpbk5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsRG9tYWluTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNTM1ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbERvbWFpbk5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRQcm92aWRlcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsRG9tYWluTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMNCisJCUlDb21tb25Db250ZW50UHJvdmlkZXIgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlld2VyIG15Vmlld2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gbXlFZGl0aW5nRG9tYWluOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIgbXlXb3Jrc3BhY2VTeW5jaHJvbml6ZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFJ1bm5hYmxlIG15Vmlld2VyUmVmcmVzaFJ1bm5hYmxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbERvbWFpbk5hdmlnYXRvckNvbnRlbnRQcm92aWRlcigpIHsNCisJCW15QWRhcHRlckZjdG9yeUNvbnRlbnRQcm92aWVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKA0KKwkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkNCisJCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFDQorCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7DQorCQlteUVkaXRpbmdEb21haW4gPSAoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZGl0aW5nRG9tYWluOw0KKwkJbXlFZGl0aW5nRG9tYWluLnNldFJlc291cmNlVG9SZWFkT25seU1hcChuZXcgSGFzaE1hcCgpIHsNCisJCQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7DQorCQkJCWlmICghY29udGFpbnNLZXkoa2V5KSkgew0KKwkJCQkJcHV0KGtleSwgQm9vbGVhbi5UUlVFKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gc3VwZXIuZ2V0KGtleSk7DQorCQkJfQ0KKwkJfSk7DQorCQlteVZpZXdlclJlZnJlc2hSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsNCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCWlmIChteVZpZXdlciAhPSBudWxsKSB7DQorCQkJCQlteVZpZXdlci5yZWZyZXNoKCk7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKwkJbXlXb3Jrc3BhY2VTeW5jaHJvbml6ZXIgPSBuZXcgV29ya3NwYWNlU3luY2hyb25pemVyKGVkaXRpbmdEb21haW4sDQorCQkJCW5ldyBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuRGVsZWdhdGUoKSB7DQorCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJCQkJfQ0KKw0KKwkJCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VDaGFuZ2VkKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7DQorCQkJCQkJdW5sb2FkQWxsUmVzb3VyY2VzKCk7DQorCQkJCQkJYXN5bmNSZWZyZXNoKCk7DQorCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQl9DQorDQorCQkJCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZURlbGV0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsNCisJCQkJCQl1bmxvYWRBbGxSZXNvdXJjZXMoKTsNCisJCQkJCQlhc3luY1JlZnJlc2goKTsNCisJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCX0NCisNCisJCQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlTW92ZWQoUmVzb3VyY2UgcmVzb3VyY2UsDQorCQkJCQkJCWZpbmFsIFVSSSBuZXdVUkkpIHsNCisJCQkJCQl1bmxvYWRBbGxSZXNvdXJjZXMoKTsNCisJCQkJCQlhc3luY1JlZnJlc2goKTsNCisJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCX0NCisJCQkJfSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQlteVdvcmtzcGFjZVN5bmNocm9uaXplci5kaXNwb3NlKCk7DQorCQlteVdvcmtzcGFjZVN5bmNocm9uaXplciA9IG51bGw7DQorCQlteVZpZXdlclJlZnJlc2hSdW5uYWJsZSA9IG51bGw7DQorCQlteVZpZXdlciA9IG51bGw7DQorCQl1bmxvYWRBbGxSZXNvdXJjZXMoKTsNCisJCSgoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIG15RWRpdGluZ0RvbWFpbikuZGlzcG9zZSgpOw0KKwkJbXlFZGl0aW5nRG9tYWluID0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7DQorCQlteVZpZXdlciA9IHZpZXdlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCB1bmxvYWRBbGxSZXNvdXJjZXMoKSB7DQorCQlmb3IgKFJlc291cmNlIG5leHRSZXNvdXJjZSA6IG15RWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpDQorCQkJCS5nZXRSZXNvdXJjZXMoKSkgew0KKwkJCW5leHRSZXNvdXJjZS51bmxvYWQoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBhc3luY1JlZnJlc2goKSB7DQorCQlpZiAobXlWaWV3ZXIgIT0gbnVsbCAmJiAhbXlWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgew0KKwkJCW15Vmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkNCisJCQkJCS5hc3luY0V4ZWMobXlWaWV3ZXJSZWZyZXNoUnVubmFibGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KKwkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGUgYUNvbmZpZykgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsNCisJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsNCisJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwYXJlbnRFbGVtZW50Ow0KKwkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpDQorCQkJCQkudG9TdHJpbmcoKSwgdHJ1ZSk7DQorCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBteUVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgNCisJCQkJCWZpbGVVUkksIHRydWUpOw0KKwkJCXJldHVybiB3cmFwRU9iamVjdHMoDQorCQkJCQlteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllci5nZXRDaGlsZHJlbihyZXNvdXJjZSksDQorCQkJCQlwYXJlbnRFbGVtZW50KTsNCisJCX0NCisNCisJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29tcmVsRG9tYWluTmF2aWdhdG9ySXRlbSkgew0KKwkJCXJldHVybiB3cmFwRU9iamVjdHMoDQorCQkJCQlteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllci5nZXRDaGlsZHJlbigoKENvbXJlbERvbWFpbk5hdmlnYXRvckl0ZW0pIHBhcmVudEVsZW1lbnQpDQorCQkJCQkJCS5nZXRFT2JqZWN0KCkpLCBwYXJlbnRFbGVtZW50KTsNCisJCX0NCisJCXJldHVybiBFTVBUWV9BUlJBWTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE9iamVjdFtdIHdyYXBFT2JqZWN0cyhPYmplY3RbXSBvYmplY3RzLCBPYmplY3QgcGFyZW50RWxlbWVudCkgew0KKwkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsNCisJCQlpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIEVPYmplY3QpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsRG9tYWluTmF2aWdhdG9ySXRlbSgoRU9iamVjdCkgb2JqZWN0c1tpXSwNCisJCQkJCQlwYXJlbnRFbGVtZW50LCBteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllcikpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0pIHsNCisJCQlDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0gYWJzdHJhY3ROYXZpZ2F0b3JJdGVtID0gKENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbSkgZWxlbWVudDsNCisJCQlyZXR1cm4gYWJzdHJhY3ROYXZpZ2F0b3JJdGVtLmdldFBhcmVudCgpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7DQorCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlIHx8IGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsRG9tYWluTmF2aWdhdG9ySXRlbS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsRG9tYWluTmF2aWdhdG9ySXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGY2NzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxEb21haW5OYXZpZ2F0b3JJdGVtLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbERvbWFpbk5hdmlnYXRvckl0ZW0gZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlzdGF0aWMgew0KKwkJZmluYWwgQ2xhc3NbXSBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBDbGFzc1tdIHsgRU9iamVjdC5jbGFzcywNCisJCQkJSVByb3BlcnR5U291cmNlLmNsYXNzIH07DQorCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMobmV3IElBZGFwdGVyRmFjdG9yeSgpIHsNCisNCisJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsNCisJCQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxEb21haW5OYXZpZ2F0b3JJdGVtKSB7DQorCQkJCQljb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsRG9tYWluTmF2aWdhdG9ySXRlbSBkb21haW5OYXZpZ2F0b3JJdGVtID0gKGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxEb21haW5OYXZpZ2F0b3JJdGVtKSBhZGFwdGFibGVPYmplY3Q7DQorCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBkb21haW5OYXZpZ2F0b3JJdGVtLmdldEVPYmplY3QoKTsNCisJCQkJCWlmIChhZGFwdGVyVHlwZSA9PSBFT2JqZWN0LmNsYXNzKSB7DQorCQkJCQkJcmV0dXJuIGVPYmplY3Q7DQorCQkJCQl9DQorCQkJCQlpZiAoYWRhcHRlclR5cGUgPT0gSVByb3BlcnR5U291cmNlLmNsYXNzKSB7DQorCQkJCQkJcmV0dXJuIGRvbWFpbk5hdmlnYXRvckl0ZW0uZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcigpDQorCQkJCQkJCQkuZ2V0UHJvcGVydHlTb3VyY2UoZU9iamVjdCk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgew0KKwkJCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXM7DQorCQkJfQ0KKwkJfSwgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbERvbWFpbk5hdmlnYXRvckl0ZW0uY2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIE9iamVjdCBteVBhcmVudDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRU9iamVjdCBteUVPYmplY3Q7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIG15UHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxEb21haW5OYXZpZ2F0b3JJdGVtKEVPYmplY3QgZU9iamVjdCwgT2JqZWN0IHBhcmVudCwNCisJCQlJUHJvcGVydHlTb3VyY2VQcm92aWRlciBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKSB7DQorCQlteVBhcmVudCA9IHBhcmVudDsNCisJCW15RU9iamVjdCA9IGVPYmplY3Q7DQorCQlteVByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsNCisJCXJldHVybiBteVBhcmVudDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsNCisJCXJldHVybiBteUVPYmplY3Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCkgew0KKwkJcmV0dXJuIG15UHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCisJCWlmIChvYmogaW5zdGFuY2VvZiBjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3IuQ29tcmVsRG9tYWluTmF2aWdhdG9ySXRlbSkgew0KKwkJCXJldHVybiBFY29yZVV0aWwNCisJCQkJCS5nZXRVUkkoZ2V0RU9iamVjdCgpKQ0KKwkJCQkJLmVxdWFscyhFY29yZVV0aWwNCisJCQkJCQkJLmdldFVSSSgoKGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxEb21haW5OYXZpZ2F0b3JJdGVtKSBvYmopDQorCQkJCQkJCQkJLmdldEVPYmplY3QoKSkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKwkJcmV0dXJuIEVjb3JlVXRpbC5nZXRVUkkoZ2V0RU9iamVjdCgpKS5oYXNoQ29kZSgpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbERvbWFpbk5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbERvbWFpbk5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTVlMjIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsRG9tYWluTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25MYWJlbFByb3ZpZGVyOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxEb21haW5OYXZpZ2F0b3JMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgbXlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKA0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGFDb25maWcpIHsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7DQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXJlbERvbWFpbk5hdmlnYXRvckl0ZW0pIHsNCisJCQlyZXR1cm4gbXlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXINCisJCQkJCS5nZXRJbWFnZSgoKENvbXJlbERvbWFpbk5hdmlnYXRvckl0ZW0pIGVsZW1lbnQpDQorCQkJCQkJCS5nZXRFT2JqZWN0KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21yZWxEb21haW5OYXZpZ2F0b3JJdGVtKSB7DQorCQkJcmV0dXJuIG15QWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyDQorCQkJCQkuZ2V0VGV4dCgoKENvbXJlbERvbWFpbk5hdmlnYXRvckl0ZW0pIGVsZW1lbnQpLmdldEVPYmplY3QoKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgew0KKwkJbXlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJbXlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgew0KKwkJcmV0dXJuIG15QWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmlzTGFiZWxQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCW15QWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBhbkVsZW1lbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbE5hdmlnYXRvckFjdGlvblByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JBY3Rpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGUxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JBY3Rpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25BY3Rpb25Db25zdGFudHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25WaWV3ZXJXb3JrYmVuY2hTaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3I7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gbXlDb250cmlidXRlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBPcGVuRGlhZ3JhbUFjdGlvbiBteU9wZW5EaWFncmFtQWN0aW9uOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBhU2l0ZSkgew0KKwkJc3VwZXIuaW5pdChhU2l0ZSk7DQorCQlpZiAoYVNpdGUuZ2V0Vmlld1NpdGUoKSBpbnN0YW5jZW9mIElDb21tb25WaWV3ZXJXb3JrYmVuY2hTaXRlKSB7DQorCQkJbXlDb250cmlidXRlID0gdHJ1ZTsNCisJCQltYWtlQWN0aW9ucygoSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUpIGFTaXRlLmdldFZpZXdTaXRlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlteUNvbnRyaWJ1dGUgPSBmYWxzZTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKElDb21tb25WaWV3ZXJXb3JrYmVuY2hTaXRlIHZpZXdlclNpdGUpIHsNCisJCW15T3BlbkRpYWdyYW1BY3Rpb24gPSBuZXcgT3BlbkRpYWdyYW1BY3Rpb24odmlld2VyU2l0ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCWlmICghbXlDb250cmlidXRlKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkNCisJCQkJLmdldFNlbGVjdGlvbigpOw0KKwkJbXlPcGVuRGlhZ3JhbUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQorCQlpZiAobXlPcGVuRGlhZ3JhbUFjdGlvbi5pc0VuYWJsZWQoKSkgew0KKwkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJQ29tbW9uQWN0aW9uQ29uc3RhbnRzLk9QRU4sDQorCQkJCQlteU9wZW5EaWFncmFtQWN0aW9uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGNsYXNzIE9wZW5EaWFncmFtQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIERpYWdyYW0gbXlEaWFncmFtOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUgbXlWaWV3ZXJTaXRlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBPcGVuRGlhZ3JhbUFjdGlvbihJQ29tbW9uVmlld2VyV29ya2JlbmNoU2l0ZSB2aWV3ZXJTaXRlKSB7DQorCQkJc3VwZXIoTWVzc2FnZXMuTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXJfT3BlbkRpYWdyYW1BY3Rpb25OYW1lKTsNCisJCQlteVZpZXdlclNpdGUgPSB2aWV3ZXJTaXRlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBmaW5hbCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQkJbXlEaWFncmFtID0gbnVsbDsNCisJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7DQorCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQorCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBDb21yZWxOYXZpZ2F0b3JJdGVtKSB7DQorCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKENvbXJlbE5hdmlnYXRvckl0ZW0pIHNlbGVjdGVkRWxlbWVudCkNCisJCQkJCQkJLmdldFZpZXcoKTsNCisJCQkJfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7DQorCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKElBZGFwdGFibGUpIHNlbGVjdGVkRWxlbWVudCkNCisJCQkJCQkJLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7DQorCQkJCX0NCisJCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsNCisJCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCQlpZiAoQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRA0KKwkJCQkJCQkuZXF1YWxzKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChkaWFncmFtKSkpIHsNCisJCQkJCQlteURpYWdyYW0gPSBkaWFncmFtOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCXNldEVuYWJsZWQobXlEaWFncmFtICE9IG51bGwpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQlpZiAobXlEaWFncmFtID09IG51bGwgfHwgbXlEaWFncmFtLmVSZXNvdXJjZSgpID09IG51bGwpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisNCisJCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dChteURpYWdyYW0pOw0KKwkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBteVZpZXdlclNpdGUuZ2V0UGFnZSgpOw0KKwkJCXRyeSB7DQorCQkJCXBhZ2Uub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgQ29tcmVsRGlhZ3JhbUVkaXRvci5JRCk7DQorCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgew0KKwkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkJIkV4Y2VwdGlvbiB3aGlsZSBvcGVubmluZyBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBzdGF0aWMgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KERpYWdyYW0gZGlhZ3JhbSkgew0KKwkJCVJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7DQorCQkJZm9yIChFT2JqZWN0IG5leHRFT2JqZWN0IDogZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkpIHsNCisJCQkJaWYgKG5leHRFT2JqZWN0ID09IGRpYWdyYW0pIHsNCisJCQkJCXJldHVybiBuZXcgRmlsZUVkaXRvcklucHV0KA0KKwkJCQkJCQlXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsNCisJCQkJfQ0KKwkJCQlpZiAobmV4dEVPYmplY3QgaW5zdGFuY2VvZiBEaWFncmFtKSB7DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCQlVUkkgdXJpID0gRWNvcmVVdGlsLmdldFVSSShkaWFncmFtKTsNCisJCQlTdHJpbmcgZWRpdG9yTmFtZSA9IHVyaS5sYXN0U2VnbWVudCgpICsgJyMnDQorCQkJCQkrIGRpYWdyYW0uZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0pOw0KKwkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBVUklFZGl0b3JJbnB1dCh1cmksIGVkaXRvck5hbWUpOw0KKwkJCXJldHVybiBlZGl0b3JJbnB1dDsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbE5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTU5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDYxNjIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3I7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50UHJvdmlkZXI7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuKjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkNvbnRlbnRQcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXdlciBteVZpZXdlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgV29ya3NwYWNlU3luY2hyb25pemVyIG15V29ya3NwYWNlU3luY2hyb25pemVyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBSdW5uYWJsZSBteVZpZXdlclJlZnJlc2hSdW5uYWJsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJzZXJpYWwiLCAicmF3dHlwZXMiIH0pDQorCXB1YmxpYyBDb21yZWxOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIoKSB7DQorCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsNCisJCW15RWRpdGluZ0RvbWFpbiA9IChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkaXRpbmdEb21haW47DQorCQlteUVkaXRpbmdEb21haW4uc2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKG5ldyBIYXNoTWFwKCkgew0KKwkJCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsNCisJCQkJaWYgKCFjb250YWluc0tleShrZXkpKSB7DQorCQkJCQlwdXQoa2V5LCBCb29sZWFuLlRSVUUpOw0KKwkJCQl9DQorCQkJCXJldHVybiBzdXBlci5nZXQoa2V5KTsNCisJCQl9DQorCQl9KTsNCisJCW15Vmlld2VyUmVmcmVzaFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgew0KKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJaWYgKG15Vmlld2VyICE9IG51bGwpIHsNCisJCQkJCW15Vmlld2VyLnJlZnJlc2goKTsNCisJCQkJfQ0KKwkJCX0NCisJCX07DQorCQlteVdvcmtzcGFjZVN5bmNocm9uaXplciA9IG5ldyBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIoZWRpdGluZ0RvbWFpbiwNCisJCQkJbmV3IFdvcmtzcGFjZVN5bmNocm9uaXplci5EZWxlZ2F0ZSgpIHsNCisJCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQkJCQl9DQorDQorCQkJCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZUNoYW5nZWQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UpIHsNCisJCQkJCQl1bmxvYWRBbGxSZXNvdXJjZXMoKTsNCisJCQkJCQlhc3luY1JlZnJlc2goKTsNCisJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCX0NCisNCisJCQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsZXRlZChSZXNvdXJjZSByZXNvdXJjZSkgew0KKwkJCQkJCXVubG9hZEFsbFJlc291cmNlcygpOw0KKwkJCQkJCWFzeW5jUmVmcmVzaCgpOw0KKwkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJfQ0KKw0KKwkJCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VNb3ZlZChSZXNvdXJjZSByZXNvdXJjZSwNCisJCQkJCQkJZmluYWwgVVJJIG5ld1VSSSkgew0KKwkJCQkJCXVubG9hZEFsbFJlc291cmNlcygpOw0KKwkJCQkJCWFzeW5jUmVmcmVzaCgpOw0KKwkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJfQ0KKwkJCQl9KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCisJCW15V29ya3NwYWNlU3luY2hyb25pemVyLmRpc3Bvc2UoKTsNCisJCW15V29ya3NwYWNlU3luY2hyb25pemVyID0gbnVsbDsNCisJCW15Vmlld2VyUmVmcmVzaFJ1bm5hYmxlID0gbnVsbDsNCisJCW15Vmlld2VyID0gbnVsbDsNCisJCXVubG9hZEFsbFJlc291cmNlcygpOw0KKwkJKChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgbXlFZGl0aW5nRG9tYWluKS5kaXNwb3NlKCk7DQorCQlteUVkaXRpbmdEb21haW4gPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsNCisJCW15Vmlld2VyID0gdmlld2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHVubG9hZEFsbFJlc291cmNlcygpIHsNCisJCWZvciAoUmVzb3VyY2UgbmV4dFJlc291cmNlIDogbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkNCisJCQkJLmdldFJlc291cmNlcygpKSB7DQorCQkJbmV4dFJlc291cmNlLnVubG9hZCgpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIGFzeW5jUmVmcmVzaCgpIHsNCisJCWlmIChteVZpZXdlciAhPSBudWxsICYmICFteVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7DQorCQkJbXlWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKQ0KKwkJCQkJLmFzeW5jRXhlYyhteVZpZXdlclJlZnJlc2hSdW5uYWJsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7DQorCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0KElDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZSBhQ29uZmlnKSB7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgew0KKwkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgew0KKwkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHBhcmVudEVsZW1lbnQ7DQorCQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkNCisJCQkJCS50b1N0cmluZygpLCB0cnVlKTsNCisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG15RWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKA0KKwkJCQkJZmlsZVVSSSwgdHJ1ZSk7DQorCQkJQXJyYXlMaXN0PENvbXJlbE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q29tcmVsTmF2aWdhdG9ySXRlbT4oKTsNCisJCQlBcnJheUxpc3Q8Vmlldz4gdG9wVmlld3MgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KHJlc291cmNlDQorCQkJCQkuZ2V0Q29udGVudHMoKS5zaXplKCkpOw0KKwkJCWZvciAoRU9iamVjdCBvIDogcmVzb3VyY2UuZ2V0Q29udGVudHMoKSkgew0KKwkJCQlpZiAobyBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQkJCXRvcFZpZXdzLmFkZCgoVmlldykgbyk7DQorCQkJCX0NCisJCQl9DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcygNCisJCQkJCXNlbGVjdFZpZXdzQnlUeXBlKHRvcFZpZXdzLA0KKwkJCQkJCQlDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lEKSwgZmlsZSwgZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29tcmVsTmF2aWdhdG9yR3JvdXApIHsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBncm91cCA9IChDb21yZWxOYXZpZ2F0b3JHcm91cCkgcGFyZW50RWxlbWVudDsNCisJCQlyZXR1cm4gZ3JvdXAuZ2V0Q2hpbGRyZW4oKTsNCisJCX0NCisNCisJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29tcmVsTmF2aWdhdG9ySXRlbSkgew0KKwkJCUNvbXJlbE5hdmlnYXRvckl0ZW0gbmF2aWdhdG9ySXRlbSA9IChDb21yZWxOYXZpZ2F0b3JJdGVtKSBwYXJlbnRFbGVtZW50Ow0KKwkJCWlmIChuYXZpZ2F0b3JJdGVtLmlzTGVhZigpIHx8ICFpc093blZpZXcobmF2aWdhdG9ySXRlbS5nZXRWaWV3KCkpKSB7DQorCQkJCXJldHVybiBFTVBUWV9BUlJBWTsNCisJCQl9DQorCQkJcmV0dXJuIGdldFZpZXdDaGlsZHJlbihuYXZpZ2F0b3JJdGVtLmdldFZpZXcoKSwgcGFyZW50RWxlbWVudCk7DQorCQl9DQorDQorCQkvKg0KKwkJICogRHVlIHRvIHBsdWdpbi54bWwgcmVzdHJpY3Rpb25zIHRoaXMgY29kZSB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciB2aWV3cyByZXByZXNlbnRpbmcNCisJCSAqIHNob3J0Y3V0cyB0byB0aGlzIGRpYWdyYW0gZWxlbWVudHMgY3JlYXRlZCBvbiBvdGhlciBkaWFncmFtcy4gDQorCQkgKi8NCisJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgew0KKwkJCVZpZXcgdmlldyA9IChWaWV3KSAoKElBZGFwdGFibGUpIHBhcmVudEVsZW1lbnQpDQorCQkJCQkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsNCisJCQlpZiAodmlldyAhPSBudWxsKSB7DQorCQkJCXJldHVybiBnZXRWaWV3Q2hpbGRyZW4odmlldywgcGFyZW50RWxlbWVudCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuIEVNUFRZX0FSUkFZOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIE9iamVjdFtdIGdldFZpZXdDaGlsZHJlbihWaWV3IHZpZXcsIE9iamVjdCBwYXJlbnRFbGVtZW50KSB7DQorCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsNCisNCisJCWNhc2UgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCXJlc3VsdC5hZGRBbGwoZ2V0Rm9yZWlnblNob3J0Y3V0cygoRGlhZ3JhbSkgdmlldywgcGFyZW50RWxlbWVudCkpOw0KKwkJCURpYWdyYW0gc3YgPSAoRGlhZ3JhbSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9Db21wb3NpdGVSZWZhY3RvcmluZ18xMDAwX2xpbmtzLA0KKwkJCQkJImljb25zL2xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldERpYWdyYW1MaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWxpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBsaW5rcywgZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldERpYWdyYW1MaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIGxpbmtzLCBmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0RGlhZ3JhbUxpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgbGlua3MsIGZhbHNlKSk7DQorCQkJaWYgKCFsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgaW5jb21pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAwOV9pbmNvbWluZ2xpbmtzLA0KKwkJCQkJImljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDlfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldEluY29taW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFpbmNvbWluZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKGluY29taW5nbGlua3MpOw0KKwkJCX0NCisJCQlpZiAoIW91dGdvaW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQob3V0Z29pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlFZGdlIHN2ID0gKEVkZ2UpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgdGFyZ2V0ID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDFfdGFyZ2V0LA0KKwkJCQkJImljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIHNvdXJjZSA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVQb3J0TWFwcGluZ180MDAxX3NvdXJjZSwNCisJCQkJCSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NUYXJnZXRCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJaWYgKCF0YXJnZXQuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQodGFyZ2V0KTsNCisJCQl9DQorCQkJaWYgKCFzb3VyY2UuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoc291cmNlKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDMxX2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAzMV9vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDEzX2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAxM19vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMTRfaW5jb21pbmdsaW5rcywNCisJCQkJCSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBvdXRnb2luZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMTRfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWlmICghaW5jb21pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChpbmNvbWluZ2xpbmtzKTsNCisJCQl9DQorCQkJaWYgKCFvdXRnb2luZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKG91dGdvaW5nbGlua3MpOw0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgaW5jb21pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDMyX2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDMyX291dGdvaW5nbGlua3MsDQorCQkJCQkiaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldEluY29taW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIGluY29taW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAyNF9pbmNvbWluZ2xpbmtzLA0KKwkJCQkJImljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAyNF9vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlpbmNvbWluZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJaW5jb21pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFpbmNvbWluZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKGluY29taW5nbGlua3MpOw0KKwkJCX0NCisJCQlpZiAoIW91dGdvaW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQob3V0Z29pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgaW5jb21pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAwMV9pbmNvbWluZ2xpbmtzLA0KKwkJCQkJImljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDFfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldEluY29taW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFpbmNvbWluZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKGluY29taW5nbGlua3MpOw0KKwkJCX0NCisJCQlpZiAoIW91dGdvaW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQob3V0Z29pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgaW5jb21pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAzNV9pbmNvbWluZ2xpbmtzLA0KKwkJCQkJImljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMzVfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldEluY29taW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFpbmNvbWluZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKGluY29taW5nbGlua3MpOw0KKwkJCX0NCisJCQlpZiAoIW91dGdvaW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQob3V0Z29pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMTBfaW5jb21pbmdsaW5rcywNCisJCQkJCSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBvdXRnb2luZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMTBfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWlmICghaW5jb21pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChpbmNvbWluZ2xpbmtzKTsNCisJCQl9DQorCQkJaWYgKCFvdXRnb2luZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKG91dGdvaW5nbGlua3MpOw0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVPdXRwdXRQb3J0XzMwMTFfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFvdXRnb2luZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKG91dGdvaW5nbGlua3MpOw0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgaW5jb21pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDI4X2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDI4X291dGdvaW5nbGlua3MsDQorCQkJCQkiaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldEluY29taW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIGluY29taW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAxN19pbmNvbWluZ2xpbmtzLA0KKwkJCQkJImljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAxN19vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlpbmNvbWluZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJaW5jb21pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFpbmNvbWluZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKGluY29taW5nbGlua3MpOw0KKwkJCX0NCisJCQlpZiAoIW91dGdvaW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQob3V0Z29pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgaW5jb21pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAwNV9pbmNvbWluZ2xpbmtzLA0KKwkJCQkJImljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDVfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldEluY29taW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFpbmNvbWluZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKGluY29taW5nbGlua3MpOw0KKwkJCX0NCisJCQlpZiAoIW91dGdvaW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQob3V0Z29pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgaW5jb21pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDAyX2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDAyX291dGdvaW5nbGlua3MsDQorCQkJCQkiaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldEluY29taW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWluY29taW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlpbmNvbWluZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDIzX2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAyM19vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDI3X2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAyN19vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIGluY29taW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAwNl9pbmNvbWluZ2xpbmtzLA0KKwkJCQkJImljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAwNl9vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlpbmNvbWluZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJaW5jb21pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFpbmNvbWluZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKGluY29taW5nbGlua3MpOw0KKwkJCX0NCisJCQlpZiAoIW91dGdvaW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQob3V0Z29pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8yMDAxX2luY29taW5nbGlua3MsDQorCQkJCQkiaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29tcmVsTmF2aWdhdG9yR3JvdXAgb3V0Z29pbmdsaW5rcyA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMjAwMV9vdXRnb2luZ2xpbmtzLA0KKwkJCQkJImljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQlpZiAoIWluY29taW5nbGlua3MuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaW5jb21pbmdsaW5rcyk7DQorCQkJfQ0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBvdXRnb2luZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpT3V0cHV0UG9ydF8zMDE1X291dGdvaW5nbGlua3MsDQorCQkJCQkiaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCUVkZ2Ugc3YgPSAoRWRnZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCB0YXJnZXQgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlQb3J0TWFwcGluZ180MDAyX3RhcmdldCwNCisJCQkJCSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBzb3VyY2UgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlQb3J0TWFwcGluZ180MDAyX3NvdXJjZSwNCisJCQkJCSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NUYXJnZXRCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXRhcmdldC5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgdGFyZ2V0LA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NUYXJnZXRCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXRhcmdldC5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgdGFyZ2V0LA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NUYXJnZXRCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXRhcmdldC5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgdGFyZ2V0LA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NUYXJnZXRCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJdGFyZ2V0LmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCB0YXJnZXQsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWlmICghdGFyZ2V0LmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKHRhcmdldCk7DQorCQkJfQ0KKwkJCWlmICghc291cmNlLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKHNvdXJjZSk7DQorCQkJfQ0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBpbmNvbWluZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMjBfaW5jb21pbmdsaW5rcywNCisJCQkJCSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBvdXRnb2luZ2xpbmtzID0gbmV3IENvbXJlbE5hdmlnYXRvckdyb3VwKA0KKwkJCQkJTWVzc2FnZXMuTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMjBfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0SW5jb21pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJaW5jb21pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCWluY29taW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWlmICghaW5jb21pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChpbmNvbWluZ2xpbmtzKTsNCisJCQl9DQorCQkJaWYgKCFvdXRnb2luZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKG91dGdvaW5nbGlua3MpOw0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJRWRnZSBzdiA9IChFZGdlKSB2aWV3Ow0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIHRhcmdldCA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDNfdGFyZ2V0LA0KKwkJCQkJImljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIHNvdXJjZSA9IG5ldyBDb21yZWxOYXZpZ2F0b3JHcm91cCgNCisJCQkJCU1lc3NhZ2VzLk5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDNfc291cmNlLA0KKwkJCQkJImljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJA0KKwkJCUNvbGxlY3Rpb248Vmlldz4gY29ubmVjdGVkVmlld3M7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1RhcmdldEJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQl0YXJnZXQuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHRhcmdldCwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRMaW5rc1NvdXJjZUJ5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlzb3VyY2UuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHNvdXJjZSwNCisJCQkJCXRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldExpbmtzU291cmNlQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXNvdXJjZS5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgc291cmNlLA0KKwkJCQkJdHJ1ZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJc291cmNlLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBzb3VyY2UsDQorCQkJCQl0cnVlKSk7DQorCQkJaWYgKCF0YXJnZXQuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQodGFyZ2V0KTsNCisJCQl9DQorCQkJaWYgKCFzb3VyY2UuaXNFbXB0eSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoc291cmNlKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOiB7DQorCQkJTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4oKTsNCisJCQlOb2RlIHN2ID0gKE5vZGUpIHZpZXc7DQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlT3V0cHV0UG9ydF8zMDE4X291dGdvaW5nbGlua3MsDQorCQkJCQkiaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIsIHBhcmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkDQorCQkJQ29sbGVjdGlvbjxWaWV3PiBjb25uZWN0ZWRWaWV3czsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlvdXRnb2luZ2xpbmtzLmFkZENoaWxkcmVuKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJb3V0Z29pbmdsaW5rcywgdHJ1ZSkpOw0KKwkJCWlmICghb3V0Z29pbmdsaW5rcy5pc0VtcHR5KCkpIHsNCisJCQkJcmVzdWx0LmFkZChvdXRnb2luZ2xpbmtzKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7DQorCQl9DQorDQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKA0KKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoY29ubmVjdGVkVmlld3MsDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJcmVzdWx0LmFkZEFsbChjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywgcGFyZW50RWxlbWVudCwNCisJCQkJCWZhbHNlKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbihzdiksDQorCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldENoaWxkcmVuQnlUeXBlKGNvbm5lY3RlZFZpZXdzLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoDQorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJY29ubmVjdGVkVmlld3MgPSBnZXRDaGlsZHJlbkJ5VHlwZShjb25uZWN0ZWRWaWV3cywNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZU5hdmlnYXRvckl0ZW1zKGNvbm5lY3RlZFZpZXdzLCBwYXJlbnRFbGVtZW50LA0KKwkJCQkJZmFsc2UpKTsNCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDogew0KKwkJCUxpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0+KCk7DQorCQkJTm9kZSBzdiA9IChOb2RlKSB2aWV3Ow0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG91dGdvaW5nbGlua3MgPSBuZXcgQ29tcmVsTmF2aWdhdG9yR3JvdXAoDQorCQkJCQlNZXNzYWdlcy5OYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlPdXRwdXRQb3J0XzMwMjFfb3V0Z29pbmdsaW5rcywNCisJCQkJCSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIiwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0T3V0Z29pbmdMaW5rc0J5VHlwZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3YpLA0KKwkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQkJb3V0Z29pbmdsaW5rcy5hZGRDaGlsZHJlbihjcmVhdGVOYXZpZ2F0b3JJdGVtcyhjb25uZWN0ZWRWaWV3cywNCisJCQkJCW91dGdvaW5nbGlua3MsIHRydWUpKTsNCisJCQljb25uZWN0ZWRWaWV3cyA9IGdldE91dGdvaW5nTGlua3NCeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCW91dGdvaW5nbGlua3MuYWRkQ2hpbGRyZW4oY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsDQorCQkJCQlvdXRnb2luZ2xpbmtzLCB0cnVlKSk7DQorCQkJaWYgKCFvdXRnb2luZ2xpbmtzLmlzRW1wdHkoKSkgew0KKwkJCQlyZXN1bHQuYWRkKG91dGdvaW5nbGlua3MpOw0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsNCisJCX0NCisNCisJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6IHsNCisJCQlMaW5rZWRMaXN0PENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtPigpOw0KKwkJCU5vZGUgc3YgPSAoTm9kZSkgdmlldzsNCisJCQlDb2xsZWN0aW9uPFZpZXc+IGNvbm5lY3RlZFZpZXdzOw0KKwkJCWNvbm5lY3RlZFZpZXdzID0gZ2V0Q2hpbGRyZW5CeVR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN2KSwNCisJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTmF2aWdhdG9ySXRlbXMoY29ubmVjdGVkVmlld3MsIHBhcmVudEVsZW1lbnQsDQorCQkJCQlmYWxzZSkpOw0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOw0KKwkJfQ0KKwkJfQ0KKwkJcmV0dXJuIEVNUFRZX0FSUkFZOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb248Vmlldz4gZ2V0TGlua3NTb3VyY2VCeVR5cGUoQ29sbGVjdGlvbjxFZGdlPiBlZGdlcywNCisJCQlTdHJpbmcgdHlwZSkgew0KKwkJTGlua2VkTGlzdDxWaWV3PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChFZGdlIG5leHRFZGdlIDogZWRnZXMpIHsNCisJCQlWaWV3IG5leHRFZGdlU291cmNlID0gbmV4dEVkZ2UuZ2V0U291cmNlKCk7DQorCQkJaWYgKHR5cGUuZXF1YWxzKG5leHRFZGdlU291cmNlLmdldFR5cGUoKSkNCisJCQkJCSYmIGlzT3duVmlldyhuZXh0RWRnZVNvdXJjZSkpIHsNCisJCQkJcmVzdWx0LmFkZChuZXh0RWRnZVNvdXJjZSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBDb2xsZWN0aW9uPFZpZXc+IGdldExpbmtzVGFyZ2V0QnlUeXBlKENvbGxlY3Rpb248RWRnZT4gZWRnZXMsDQorCQkJU3RyaW5nIHR5cGUpIHsNCisJCUxpbmtlZExpc3Q8Vmlldz4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoRWRnZSBuZXh0RWRnZSA6IGVkZ2VzKSB7DQorCQkJVmlldyBuZXh0RWRnZVRhcmdldCA9IG5leHRFZGdlLmdldFRhcmdldCgpOw0KKwkJCWlmICh0eXBlLmVxdWFscyhuZXh0RWRnZVRhcmdldC5nZXRUeXBlKCkpDQorCQkJCQkmJiBpc093blZpZXcobmV4dEVkZ2VUYXJnZXQpKSB7DQorCQkJCXJlc3VsdC5hZGQobmV4dEVkZ2VUYXJnZXQpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgQ29sbGVjdGlvbjxWaWV3PiBnZXRPdXRnb2luZ0xpbmtzQnlUeXBlKA0KKwkJCUNvbGxlY3Rpb248PyBleHRlbmRzIFZpZXc+IG5vZGVzLCBTdHJpbmcgdHlwZSkgew0KKwkJTGlua2VkTGlzdDxWaWV3PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IG5leHROb2RlIDogbm9kZXMpIHsNCisJCQlyZXN1bHQuYWRkQWxsKHNlbGVjdFZpZXdzQnlUeXBlKG5leHROb2RlLmdldFNvdXJjZUVkZ2VzKCksIHR5cGUpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgQ29sbGVjdGlvbjxWaWV3PiBnZXRJbmNvbWluZ0xpbmtzQnlUeXBlKA0KKwkJCUNvbGxlY3Rpb248PyBleHRlbmRzIFZpZXc+IG5vZGVzLCBTdHJpbmcgdHlwZSkgew0KKwkJTGlua2VkTGlzdDxWaWV3PiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxWaWV3PigpOw0KKwkJZm9yIChWaWV3IG5leHROb2RlIDogbm9kZXMpIHsNCisJCQlyZXN1bHQuYWRkQWxsKHNlbGVjdFZpZXdzQnlUeXBlKG5leHROb2RlLmdldFRhcmdldEVkZ2VzKCksIHR5cGUpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgQ29sbGVjdGlvbjxWaWV3PiBnZXRDaGlsZHJlbkJ5VHlwZSgNCisJCQlDb2xsZWN0aW9uPD8gZXh0ZW5kcyBWaWV3PiBub2RlcywgU3RyaW5nIHR5cGUpIHsNCisJCUxpbmtlZExpc3Q8Vmlldz4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyBuZXh0Tm9kZSA6IG5vZGVzKSB7DQorCQkJcmVzdWx0LmFkZEFsbChzZWxlY3RWaWV3c0J5VHlwZShuZXh0Tm9kZS5nZXRDaGlsZHJlbigpLCB0eXBlKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb248Vmlldz4gZ2V0RGlhZ3JhbUxpbmtzQnlUeXBlKA0KKwkJCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMsIFN0cmluZyB0eXBlKSB7DQorCQlBcnJheUxpc3Q8Vmlldz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOw0KKwkJZm9yIChEaWFncmFtIG5leHREaWFncmFtIDogZGlhZ3JhbXMpIHsNCisJCQlyZXN1bHQuYWRkQWxsKHNlbGVjdFZpZXdzQnlUeXBlKG5leHREaWFncmFtLmdldEVkZ2VzKCksIHR5cGUpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLy8gVE9ETyByZWZhY3RvciBhcyBzdGF0aWMgbWV0aG9kDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb248Vmlldz4gc2VsZWN0Vmlld3NCeVR5cGUoQ29sbGVjdGlvbjxWaWV3PiB2aWV3cywNCisJCQlTdHJpbmcgdHlwZSkgew0KKwkJQXJyYXlMaXN0PFZpZXc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsNCisJCWZvciAoVmlldyBuZXh0VmlldyA6IHZpZXdzKSB7DQorCQkJaWYgKHR5cGUuZXF1YWxzKG5leHRWaWV3LmdldFR5cGUoKSkgJiYgaXNPd25WaWV3KG5leHRWaWV3KSkgew0KKwkJCQlyZXN1bHQuYWRkKG5leHRWaWV3KTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNPd25WaWV3KFZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTU9ERUxfSUQNCisJCQkJLmVxdWFscyhDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQodmlldykpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb248Q29tcmVsTmF2aWdhdG9ySXRlbT4gY3JlYXRlTmF2aWdhdG9ySXRlbXMoDQorCQkJQ29sbGVjdGlvbjxWaWV3PiB2aWV3cywgT2JqZWN0IHBhcmVudCwgYm9vbGVhbiBpc0xlYWZzKSB7DQorCQlBcnJheUxpc3Q8Q29tcmVsTmF2aWdhdG9ySXRlbT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDb21yZWxOYXZpZ2F0b3JJdGVtPigNCisJCQkJdmlld3Muc2l6ZSgpKTsNCisJCWZvciAoVmlldyBuZXh0VmlldyA6IHZpZXdzKSB7DQorCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTmF2aWdhdG9ySXRlbShuZXh0VmlldywgcGFyZW50LCBpc0xlYWZzKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb248Q29tcmVsTmF2aWdhdG9ySXRlbT4gZ2V0Rm9yZWlnblNob3J0Y3V0cygNCisJCQlEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBwYXJlbnQpIHsNCisJCUxpbmtlZExpc3Q8Vmlldz4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Vmlldz4oKTsNCisJCWZvciAoSXRlcmF0b3I8Vmlldz4gaXQgPSBkaWFncmFtLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKwkJCVZpZXcgbmV4dFZpZXcgPSBpdC5uZXh0KCk7DQorCQkJaWYgKCFpc093blZpZXcobmV4dFZpZXcpDQorCQkJCQkmJiBuZXh0Vmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJcmVzdWx0LmFkZChuZXh0Vmlldyk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGNyZWF0ZU5hdmlnYXRvckl0ZW1zKHJlc3VsdCwgcGFyZW50LCBmYWxzZSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7DQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbSkgew0KKwkJCUNvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbSBhYnN0cmFjdE5hdmlnYXRvckl0ZW0gPSAoQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtKSBlbGVtZW50Ow0KKwkJCXJldHVybiBhYnN0cmFjdE5hdmlnYXRvckl0ZW0uZ2V0UGFyZW50KCk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsNCisJCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUgfHwgZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JHcm91cC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsTmF2aWdhdG9yR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODhiMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsTmF2aWdhdG9yR3JvdXAuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvcjsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsTmF2aWdhdG9yR3JvdXAgZXh0ZW5kcyBDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0gew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgbXlHcm91cE5hbWU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBteUljb247DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbGxlY3Rpb24gbXlDaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0KCk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlDb21yZWxOYXZpZ2F0b3JHcm91cChTdHJpbmcgZ3JvdXBOYW1lLCBTdHJpbmcgaWNvbiwgT2JqZWN0IHBhcmVudCkgew0KKwkJc3VwZXIocGFyZW50KTsNCisJCW15R3JvdXBOYW1lID0gZ3JvdXBOYW1lOw0KKwkJbXlJY29uID0gaWNvbjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7DQorCQlyZXR1cm4gbXlHcm91cE5hbWU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsNCisJCXJldHVybiBteUljb247DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsNCisJCXJldHVybiBteUNoaWxkcmVuLnRvQXJyYXkoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgew0KKwkJbXlDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChPYmplY3QgY2hpbGQpIHsNCisJCW15Q2hpbGRyZW4uYWRkKGNoaWxkKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsNCisJCXJldHVybiBteUNoaWxkcmVuLnNpemUoKSA9PSAwOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KKwkJaWYgKG9iaiBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JHcm91cCkgew0KKwkJCWNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JHcm91cCBhbm90aGVyR3JvdXAgPSAoY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbE5hdmlnYXRvckdyb3VwKSBvYmo7DQorCQkJaWYgKGdldEdyb3VwTmFtZSgpLmVxdWFscyhhbm90aGVyR3JvdXAuZ2V0R3JvdXBOYW1lKCkpKSB7DQorCQkJCXJldHVybiBnZXRQYXJlbnQoKS5lcXVhbHMoYW5vdGhlckdyb3VwLmdldFBhcmVudCgpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorCQlyZXR1cm4gZ2V0R3JvdXBOYW1lKCkuaGFzaENvZGUoKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjNzRmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbE5hdmlnYXRvckl0ZW0uamF2YQpAQCAtMCwwICsxLDkzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxOYXZpZ2F0b3JJdGVtIGV4dGVuZHMgQ29tcmVsQWJzdHJhY3ROYXZpZ2F0b3JJdGVtIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyB7DQorCQlmaW5hbCBDbGFzc1tdIHN1cHBvcnRlZFR5cGVzID0gbmV3IENsYXNzW10geyBWaWV3LmNsYXNzLCBFT2JqZWN0LmNsYXNzIH07DQorCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMobmV3IElBZGFwdGVyRmFjdG9yeSgpIHsNCisNCisJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsNCisJCQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JJdGVtDQorCQkJCQkJJiYgKGFkYXB0ZXJUeXBlID09IFZpZXcuY2xhc3MgfHwgYWRhcHRlclR5cGUgPT0gRU9iamVjdC5jbGFzcykpIHsNCisJCQkJCXJldHVybiAoKGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JJdGVtKSBhZGFwdGFibGVPYmplY3QpDQorCQkJCQkJCS5nZXRWaWV3KCk7DQorCQkJCX0NCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKw0KKwkJCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgew0KKwkJCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXM7DQorCQkJfQ0KKwkJfSwgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbE5hdmlnYXRvckl0ZW0uY2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgbXlWaWV3Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIG15TGVhZiA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbE5hdmlnYXRvckl0ZW0oVmlldyB2aWV3LCBPYmplY3QgcGFyZW50LCBib29sZWFuIGlzTGVhZikgew0KKwkJc3VwZXIocGFyZW50KTsNCisJCW15VmlldyA9IHZpZXc7DQorCQlteUxlYWYgPSBpc0xlYWY7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBWaWV3IGdldFZpZXcoKSB7DQorCQlyZXR1cm4gbXlWaWV3Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKSB7DQorCQlyZXR1cm4gbXlMZWFmOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KKwkJaWYgKG9iaiBpbnN0YW5jZW9mIGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JJdGVtKSB7DQorCQkJcmV0dXJuIEVjb3JlVXRpbA0KKwkJCQkJLmdldFVSSShnZXRWaWV3KCkpDQorCQkJCQkuZXF1YWxzKEVjb3JlVXRpbA0KKwkJCQkJCQkuZ2V0VVJJKCgoY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbE5hdmlnYXRvckl0ZW0pIG9iaikNCisJCQkJCQkJCQkuZ2V0VmlldygpKSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorCQlyZXR1cm4gRWNvcmVVdGlsLmdldFVSSShnZXRWaWV3KCkpLmhhc2hDb2RlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YWRkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNDE3IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVQYXRoTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy4qOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlczsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFBhcnNlclByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsTmF2aWdhdG9yTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cw0KKwkJSUNvbW1vbkxhYmVsUHJvdmlkZXIsIElUcmVlUGF0aExhYmVsUHJvdmlkZXIgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIHsNCisJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4NCisJCQkJLmdldEluc3RhbmNlKCkNCisJCQkJLmdldEltYWdlUmVnaXN0cnkoKQ0KKwkJCQkucHV0KCJOYXZpZ2F0b3I/VW5rbm93bkVsZW1lbnQiLCBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKTsgLy8kTk9OLU5MUy0xJA0KKwkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbg0KKwkJCQkuZ2V0SW5zdGFuY2UoKQ0KKwkJCQkuZ2V0SW1hZ2VSZWdpc3RyeSgpDQorCQkJCS5wdXQoIk5hdmlnYXRvcj9JbWFnZU5vdEZvdW5kIiwgSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSk7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWwoVmlld2VyTGFiZWwgbGFiZWwsIFRyZWVQYXRoIGVsZW1lbnRQYXRoKSB7DQorCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRQYXRoLmdldExhc3RTZWdtZW50KCk7DQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXJlbE5hdmlnYXRvckl0ZW0NCisJCQkJJiYgIWlzT3duVmlldygoKENvbXJlbE5hdmlnYXRvckl0ZW0pIGVsZW1lbnQpLmdldFZpZXcoKSkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlsYWJlbC5zZXRUZXh0KGdldFRleHQoZWxlbWVudCkpOw0KKwkJbGFiZWwuc2V0SW1hZ2UoZ2V0SW1hZ2UoZWxlbWVudCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsNCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcmVsTmF2aWdhdG9yR3JvdXApIHsNCisJCQlDb21yZWxOYXZpZ2F0b3JHcm91cCBncm91cCA9IChDb21yZWxOYXZpZ2F0b3JHcm91cCkgZWxlbWVudDsNCisJCQlyZXR1cm4gQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZWRJbWFnZSgNCisJCQkJCWdyb3VwLmdldEljb24oKSk7DQorCQl9DQorDQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXJlbE5hdmlnYXRvckl0ZW0pIHsNCisJCQlDb21yZWxOYXZpZ2F0b3JJdGVtIG5hdmlnYXRvckl0ZW0gPSAoQ29tcmVsTmF2aWdhdG9ySXRlbSkgZWxlbWVudDsNCisJCQlpZiAoIWlzT3duVmlldyhuYXZpZ2F0b3JJdGVtLmdldFZpZXcoKSkpIHsNCisJCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOw0KKwkJCX0NCisJCQlyZXR1cm4gZ2V0SW1hZ2UobmF2aWdhdG9ySXRlbS5nZXRWaWV3KCkpOw0KKwkJfQ0KKw0KKwkJLy8gRHVlIHRvIHBsdWdpbi54bWwgY29udGVudCB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciAib3duIiB2aWV3cw0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7DQorCQkJVmlldyB2aWV3ID0gKFZpZXcpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsNCisJCQlpZiAodmlldyAhPSBudWxsICYmIGlzT3duVmlldyh2aWV3KSkgew0KKwkJCQlyZXR1cm4gZ2V0SW1hZ2Uodmlldyk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoVmlldyB2aWV3KSB7DQorCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsNCisJCWNhc2UgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9EaWFncmFtP2h0dHA6Ly9jb21yZWwvMC4xP0NvbXBvc2l0ZVJlZmFjdG9yaW5nIiwgQ29tcmVsRWxlbWVudFR5cGVzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDApOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9Db25kaXRpb25DaGVjayIsIENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25DaGVja18zMDc2KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9DYXJ0ZXNpYW5RdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAzMyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP1RvcExldmVsTm9kZT9odHRwOi8vY29tcmVsLzAuMT9DYXJ0ZXNpYW5RdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMik7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP0NhcnRlc2lhblF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/QXRvbWljVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNjgpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1BhcmFsbGVsUXVldWVkVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZVF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUZpbHRlclVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTMpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/TGluaz9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVQb3J0TWFwcGluZyIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NlcXVlbnRpYWxVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzMpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP0NvbmRpdGlvbmFsVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3Mik7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgQXRvbWljVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP1RvcExldmVsTm9kZT9odHRwOi8vY29tcmVsLzAuMT9BdG9taWNVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMjAwNyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP011bHRpRmVhdHVyZVVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9Db25kaXRpb25hbFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVGZWF0dXJlVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDA4KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/QXRvbWljVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzcpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUZlYXR1cmVVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAzOSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP0NhcnRlc2lhblF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9Db25kaXRpb25hbFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwMzApOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlRmVhdHVyZVVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TZXF1ZW50aWFsVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDY5KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/QXRvbWljVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwMzQpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP011bHRpRmVhdHVyZVVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZUlucHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAxMyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUZpbHRlclVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwMTkpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9DYXJ0ZXNpYW5RdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUlucHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9QYXJhbGxlbFF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlRmVhdHVyZVVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAzOCk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUlucHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP011bHRpSW5wdXRQb3J0IiwgQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP0NvbmRpdGlvbmFsVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2Nik7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TZXF1ZW50aWFsVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDYwKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZUlucHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUlucHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ub3BMZXZlbE5vZGU/aHR0cDovL2NvbXJlbC8wLjE/Q29uZGl0aW9uYWxVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8yMDA2KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVGaWx0ZXJVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNik7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlT3V0cHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTEpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP011bHRpRmlsdGVyVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVGZWF0dXJlVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDYxKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUZpbHRlclVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlRmVhdHVyZVVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1MCk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZVF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NlcXVlbnRpYWxVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVRdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZVF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDQyKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlRmlsdGVyVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVGaWx0ZXJVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Nyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ub3BMZXZlbE5vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2VxdWVudGlhbFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMjAwNSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/UGFyYWxsZWxRdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDA0KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP011bHRpSW5wdXRQb3J0IiwgQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ub3BMZXZlbE5vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlUXVldWVkVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzIwMDQpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlSW5wdXRQb3J0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/U2luZ2xlUXVldWVkVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwMjIpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9DYXJ0ZXNpYW5RdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0Nyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP0F0b21pY1VuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDQ5KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9QYXJhbGxlbFF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUlucHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NlcXVlbnRpYWxVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzApOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9NdWx0aUZlYXR1cmVVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1Nik7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZUZpbHRlclVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9DYXJ0ZXNpYW5RdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/UGFyYWxsZWxRdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNik7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/VG9wTGV2ZWxOb2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZUlucHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMjAwMSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlGaWx0ZXJVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDQxKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NlcXVlbnRpYWxVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwMjYpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP0NvbmRpdGlvbmFsVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZUZpbHRlclVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDUyKTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlGZWF0dXJlVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTEpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP1RvcExldmVsTm9kZT9odHRwOi8vY29tcmVsLzAuMT9QYXJhbGxlbFF1ZXVlZFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlPdXRwdXRQb3J0IiwgQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/QXRvbWljVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzQpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1BhcmFsbGVsUXVldWVkVW5pdCIsIENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP0xpbms/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlQb3J0TWFwcGluZyIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP05vZGU/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlJbnB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0SW1hZ2UoDQorCQkJCQkiTmF2aWdhdG9yP0xpbms/aHR0cDovL2NvbXJlbC8wLjE/TXVsdGlTaW5nbGVQb3J0TWFwcGluZyIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9TaW5nbGVRdWV1ZWRVbml0IiwgQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2Nyk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP1NpbmdsZU91dHB1dFBvcnQiLCBDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4KTsgLy8kTk9OLU5MUy0xJA0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRJbWFnZSgNCisJCQkJCSJOYXZpZ2F0b3I/Tm9kZT9odHRwOi8vY29tcmVsLzAuMT9Db25kaXRpb25hbFVuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEpOyAvLyROT04tTkxTLTEkDQorCQljYXNlIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP011bHRpT3V0cHV0UG9ydCIsIENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7IC8vJE5PTi1OTFMtMSQNCisJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEltYWdlKA0KKwkJCQkJIk5hdmlnYXRvcj9Ob2RlP2h0dHA6Ly9jb21yZWwvMC4xP0F0b21pY1VuaXQiLCBDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc4KTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIGdldEltYWdlKCJOYXZpZ2F0b3I/VW5rbm93bkVsZW1lbnQiLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXksIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgew0KKwkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCS5nZXRJbWFnZVJlZ2lzdHJ5KCk7DQorCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7DQorCQlpZiAoaW1hZ2UgPT0gbnVsbCAmJiBlbGVtZW50VHlwZSAhPSBudWxsDQorCQkJCSYmIENvbXJlbEVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7DQorCQkJaW1hZ2UgPSBDb21yZWxFbGVtZW50VHlwZXMuZ2V0SW1hZ2UoZWxlbWVudFR5cGUpOw0KKwkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaW1hZ2UpOw0KKwkJfQ0KKw0KKwkJaWYgKGltYWdlID09IG51bGwpIHsNCisJCQlpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KCJOYXZpZ2F0b3I/SW1hZ2VOb3RGb3VuZCIpOyAvLyROT04tTkxTLTEkDQorCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpbWFnZSk7DQorCQl9DQorCQlyZXR1cm4gaW1hZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21yZWxOYXZpZ2F0b3JHcm91cCkgew0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIGdyb3VwID0gKENvbXJlbE5hdmlnYXRvckdyb3VwKSBlbGVtZW50Ow0KKwkJCXJldHVybiBncm91cC5nZXRHcm91cE5hbWUoKTsNCisJCX0NCisNCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcmVsTmF2aWdhdG9ySXRlbSkgew0KKwkJCUNvbXJlbE5hdmlnYXRvckl0ZW0gbmF2aWdhdG9ySXRlbSA9IChDb21yZWxOYXZpZ2F0b3JJdGVtKSBlbGVtZW50Ow0KKwkJCWlmICghaXNPd25WaWV3KG5hdmlnYXRvckl0ZW0uZ2V0VmlldygpKSkgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQkJcmV0dXJuIGdldFRleHQobmF2aWdhdG9ySXRlbS5nZXRWaWV3KCkpOw0KKwkJfQ0KKw0KKwkJLy8gRHVlIHRvIHBsdWdpbi54bWwgY29udGVudCB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciAib3duIiB2aWV3cw0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7DQorCQkJVmlldyB2aWV3ID0gKFZpZXcpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsNCisJCQlpZiAodmlldyAhPSBudWxsICYmIGlzT3duVmlldyh2aWV3KSkgew0KKwkJCQlyZXR1cm4gZ2V0VGV4dCh2aWV3KTsNCisJCQl9DQorCQl9DQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRUZXh0KFZpZXcgdmlldykgew0KKwkJaWYgKHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSkgew0KKwkJCXJldHVybiBnZXRVbnJlc29sdmVkRG9tYWluRWxlbWVudFByb3h5VGV4dCh2aWV3KTsNCisJCX0NCisJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSkgew0KKwkJY2FzZSBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMFRleHQodmlldyk7DQorCQljYXNlIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25DaGVja18zMDc2VGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDlUZXh0KHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDMzVGV4dCh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8yMDAyVGV4dCh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNVRleHQodmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNjhUZXh0KHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OFRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTlUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZpbHRlclVuaXRfMzA1M1RleHQodmlldyk7DQorCQljYXNlIFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVQb3J0TWFwcGluZ180MDAxVGV4dCh2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDczVGV4dCh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJUZXh0KHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzIwMDdUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDYyVGV4dCh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNDZUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzAwOFRleHQodmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNzdUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDM5VGV4dCh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOVRleHQodmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDMwVGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDU1VGV4dCh2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDY5VGV4dCh2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzAzNFRleHQodmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzAxMlRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDMxVGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMTNUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDE5VGV4dCh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwN1RleHQodmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxNFRleHQodmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM2VGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4VGV4dCh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDMyVGV4dCh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDI0VGV4dCh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNjZUZXh0KHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNjBUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwMVRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDM1VGV4dCh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDEwVGV4dCh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMjAwNlRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzAxNlRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZU91dHB1dFBvcnRfMzAxMVRleHQodmlldyk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDU4VGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDYxVGV4dCh2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNTBUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU0VGV4dCh2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDQ0VGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2NVRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNDJUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDYzVGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzA1N1RleHQodmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8yMDA1VGV4dCh2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMDRUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMjhUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMTdUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwNVRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwMjJUZXh0KHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3VGV4dCh2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzA0OVRleHQodmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQzVGV4dCh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMDJUZXh0KHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNzBUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDU2VGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzA0MFRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDIzVGV4dCh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwM1RleHQodmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1VGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMjdUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMDZUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8yMDAxVGV4dCh2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNDFUZXh0KHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwMjZUZXh0KHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzA3NVRleHQodmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDUxVGV4dCh2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMjAwM1RleHQodmlldyk7DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlPdXRwdXRQb3J0XzMwMTVUZXh0KHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDc0VGV4dCh2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMzdUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aVBvcnRNYXBwaW5nXzQwMDJUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMjBUZXh0KHZpZXcpOw0KKwkJY2FzZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDNUZXh0KHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3VGV4dCh2aWV3KTsNCisJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZU91dHB1dFBvcnRfMzAxOFRleHQodmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDcxVGV4dCh2aWV3KTsNCisJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlPdXRwdXRQb3J0XzMwMjFUZXh0KHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDc4VGV4dCh2aWV3KTsNCisJCX0NCisJCXJldHVybiBnZXRVbmtub3duRWxlbWVudFRleHQodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpSW5wdXRQb3J0XzMwMTdUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMTQpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldENvbmRpdGlvbmFsVW5pdF8zMDc1VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzUsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNTUpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA1OVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1OSwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNjMpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNlcXVlbnRpYWxVbml0XzMwNjBUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDYwLA0KKwkJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNjIpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldEF0b21pY1VuaXRfMzA3NFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDUwKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRDb25kaXRpb25DaGVja18zMDc2VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3NiwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbkNoZWNrTmFtZVR5cGVTcGVjRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDUyKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTIsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDM4KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRDb25kaXRpb25hbFVuaXRfMzA2NlRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDY2LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDYwKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzNVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDI2KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwMTZUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwMTYsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMTYpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpRmlsdGVyVW5pdF8zMDU4VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTgsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNDMpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpSW5wdXRQb3J0XzMwMzJUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMjUpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2N1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NywNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNDkpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNlcXVlbnRpYWxVbml0XzMwNzNUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczLA0KKwkJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNTEpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldEF0b21pY1VuaXRfMzAzNFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzAzNCwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDI3KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aUZlYXR1cmVVbml0XzMwNTZUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDQxKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aUZpbHRlclVuaXRfMzA0MVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDQxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDMyKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRDb25kaXRpb25hbFVuaXRfMzA0NlRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDY1KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzN1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM3LA0KKwkJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDcwKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVJbnB1dFBvcnRfMzAxM1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDEwKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwMjJUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwMjIsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDc2KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aUlucHV0UG9ydF8zMDI0VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDIxKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aVBvcnRNYXBwaW5nXzQwMDJUZXh0KFZpZXcgdmlldykgew0KKwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpRmlsdGVyVW5pdF8zMDUzVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTMsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMzkpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldEF0b21pY1VuaXRfMzA3N1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NywNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDUzKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRBdG9taWNVbml0XzMwNjhUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNjgsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA0OCk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlJbnB1dFBvcnRfMzAyMFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjAsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAxNyk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA2NCwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA0Nyk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2luZ2xlT3V0cHV0UG9ydF8zMDE4VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAxNSk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2luZ2xlUG9ydE1hcHBpbmdfNDAwMVRleHQoVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlJbnB1dFBvcnRfMzAxMFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTAsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAwNyk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2VxdWVudGlhbFVuaXRfMjAwNVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzIwMDUsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDgzKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTZXF1ZW50aWFsVW5pdF8zMDI2VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNiwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDc0KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDU1VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDQwKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDUwVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1MCwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDM2KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRDb25kaXRpb25hbFVuaXRfMzAzMFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDMwLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDcyKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1LA0KKwkJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDY2KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQzLA0KKwkJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDY4KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRDb25kaXRpb25hbFVuaXRfMzA3MVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDU3KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVJbnB1dFBvcnRfMzAyM1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDIwKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aU91dHB1dFBvcnRfMzAxNVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMTIpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpRmVhdHVyZVVuaXRfMzA2MlRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA2MiwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNDUpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMlRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA4MCk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDM5VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAzMCk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2luZ2xlT3V0cHV0UG9ydF8zMDExVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDA4KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjVUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDc1KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAzOCwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDI5KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNjNUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDQ2KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aUZpbHRlclVuaXRfMzAxOVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMTkpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwMDhUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDA4LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAwOSk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI5VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5LA0KKwkJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA3Myk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MiwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA1Nik7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDVUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwNSwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAwNCk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0QXRvbWljVW5pdF8zMDc4VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc4LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdExhYmVsVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNTQpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA1NFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNjQpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpSW5wdXRQb3J0XzMwMDJUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAwMyk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDQyVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDQyLA0KKwkJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA2OSk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMzZUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNiwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA3MSk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2VxdWVudGlhbFVuaXRfMzA0NFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA2Nyk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uZGl0aW9uYWxVbml0XzIwMDZUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMjAwNiwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDg0KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aUlucHV0UG9ydF8zMDA2VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNiwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDA1KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzMVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDI0KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRNdWx0aU91dHB1dFBvcnRfMzAyMVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDIxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDE4KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTZXF1ZW50aWFsVW5pdF8zMDY5VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2OSwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDU5KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzNUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDI4KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVJbnB1dFBvcnRfMjAwMVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMDEpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZUlucHV0UG9ydF8zMDA5VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDksDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMDYpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDgsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMzUpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwM1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMywNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNzkpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2NVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNjEpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNjFUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDYxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNDQpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwN1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNywNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNzcpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0N1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyDQorCQkJCS5nZXRQYXJzZXIoDQorCQkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NywNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMzMpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFNpbmdsZUZpbHRlclVuaXRfMzA0MFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA0MCwNCisJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMzEpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwNzgpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDBUZXh0KFZpZXcgdmlldykgew0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgZG9tYWluTW9kZWxFbGVtZW50ID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlpZiAoZG9tYWluTW9kZWxFbGVtZW50ICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZG9tYWluTW9kZWxFbGVtZW50LmdldE5hbWUoKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIk5vIGRvbWFpbiBlbGVtZW50IGZvciB2aWV3IHdpdGggdmlzdWFsSUQgPSAiICsgMTAwMCk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDEyVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDEzKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVJbnB1dFBvcnRfMzAyN1RleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDIyKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwMVRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDAyKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTZXF1ZW50aWFsVW5pdF8zMDcwVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCwNCisJCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDU4KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRBdG9taWNVbml0XzIwMDdUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzIwMDcsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlpZiAocGFyc2VyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gcGFyc2VyLmdldFByaW50U3RyaW5nKG5ldyBFT2JqZWN0QWRhcHRlcigNCisJCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcpLA0KKwkJCQkJUGFyc2VyT3B0aW9ucy5OT05FLmludFZhbHVlKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiUGFyc2VyIHdhcyBub3QgZm91bmQgZm9yIGxhYmVsICIgKyA1MDg1KTsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBnZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlcg0KKwkJCQkuZ2V0UGFyc2VyKA0KKwkJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzIwMDQsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwODIpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpSW5wdXRQb3J0XzMwMjhUZXh0KFZpZXcgdmlldykgew0KKwkJSVBhcnNlciBwYXJzZXIgPSBDb21yZWxQYXJzZXJQcm92aWRlci5nZXRQYXJzZXIoDQorCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMjMpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwM1RleHQoVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0QXRvbWljVW5pdF8zMDQ5VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDQ5LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdExhYmVsVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWlmIChwYXJzZXIgIT0gbnVsbCkgew0KKwkJCXJldHVybiBwYXJzZXIuZ2V0UHJpbnRTdHJpbmcobmV3IEVPYmplY3RBZGFwdGVyKA0KKwkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldyksDQorCQkJCQlQYXJzZXJPcHRpb25zLk5PTkUuaW50VmFsdWUoKSk7DQorCQl9IGVsc2Ugew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJQYXJzZXIgd2FzIG5vdCBmb3VuZCBmb3IgbGFiZWwgIiArIDUwMzQpOyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXINCisJCQkJLmdldFBhcnNlcigNCisJCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMsDQorCQkJCQkJdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCA/IHZpZXcuZ2V0RWxlbWVudCgpIDogdmlldywNCisJCQkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA4MSk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDUxVGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDUxLA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAzNyk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlJbnB1dFBvcnRfMzAxNFRleHQoVmlldyB2aWV3KSB7DQorCQlJUGFyc2VyIHBhcnNlciA9IENvbXJlbFBhcnNlclByb3ZpZGVyLmdldFBhcnNlcigNCisJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQsDQorCQkJCXZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwgPyB2aWV3LmdldEVsZW1lbnQoKSA6IHZpZXcsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTAxMSk7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDU3VGV4dChWaWV3IHZpZXcpIHsNCisJCUlQYXJzZXIgcGFyc2VyID0gQ29tcmVsUGFyc2VyUHJvdmlkZXIuZ2V0UGFyc2VyKA0KKwkJCQlDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDU3LA0KKwkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3LA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJaWYgKHBhcnNlciAhPSBudWxsKSB7DQorCQkJcmV0dXJuIHBhcnNlci5nZXRQcmludFN0cmluZyhuZXcgRU9iamVjdEFkYXB0ZXIoDQorCQkJCQl2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsID8gdmlldy5nZXRFbGVtZW50KCkgOiB2aWV3KSwNCisJCQkJCVBhcnNlck9wdGlvbnMuTk9ORS5pbnRWYWx1ZSgpKTsNCisJCX0gZWxzZSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlBhcnNlciB3YXMgbm90IGZvdW5kIGZvciBsYWJlbCAiICsgNTA0Mik7IC8vJE5PTi1OTFMtMSQNCisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VW5rbm93bkVsZW1lbnRUZXh0KFZpZXcgdmlldykgew0KKwkJcmV0dXJuICI8VW5rbm93bkVsZW1lbnQgVmlzdWFsX0lEID0gIiArIHZpZXcuZ2V0VHlwZSgpICsgIj4iOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGdldFVucmVzb2x2ZWREb21haW5FbGVtZW50UHJveHlUZXh0KFZpZXcgdmlldykgew0KKwkJcmV0dXJuICI8VW5yZXNvbHZlZCBkb21haW4gZWxlbWVudCBWaXN1YWxfSUQgPSAiICsgdmlldy5nZXRUeXBlKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGUgYUNvbmZpZykgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGFuRWxlbWVudCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc093blZpZXcoVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRA0KKwkJCQkuZXF1YWxzKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRCh2aWV3KSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsTmF2aWdhdG9yTGlua0hlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9uYXZpZ2F0b3IvQ29tcmVsTmF2aWdhdG9yTGlua0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDJjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JMaW5rSGVscGVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5uYXZpZ2F0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklMaW5rSGVscGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsTmF2aWdhdG9yTGlua0hlbHBlciBpbXBsZW1lbnRzIElMaW5rSGVscGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dChEaWFncmFtIGRpYWdyYW0pIHsNCisJCVJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7DQorCQlmb3IgKEVPYmplY3QgbmV4dEVPYmplY3QgOiBkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKSkgew0KKwkJCWlmIChuZXh0RU9iamVjdCA9PSBkaWFncmFtKSB7DQorCQkJCXJldHVybiBuZXcgRmlsZUVkaXRvcklucHV0KA0KKwkJCQkJCVdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSkpOw0KKwkJCX0NCisJCQlpZiAobmV4dEVPYmplY3QgaW5zdGFuY2VvZiBEaWFncmFtKSB7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJCVVSSSB1cmkgPSBFY29yZVV0aWwuZ2V0VVJJKGRpYWdyYW0pOw0KKwkJU3RyaW5nIGVkaXRvck5hbWUgPSB1cmkubGFzdFNlZ21lbnQoKSArICcjJw0KKwkJCQkrIGRpYWdyYW0uZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0pOw0KKwkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IFVSSUVkaXRvcklucHV0KHVyaSwgZWRpdG9yTmFtZSk7DQorCQlyZXR1cm4gZWRpdG9ySW5wdXQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBmaW5kU2VsZWN0aW9uKElFZGl0b3JJbnB1dCBhbklucHV0KSB7DQorCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RGlhZ3JhbURvY3VtZW50KGFuSW5wdXQpOw0KKwkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsNCisJCQlyZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsNCisJCX0NCisJCURpYWdyYW0gZGlhZ3JhbSA9IGRvY3VtZW50LmdldERpYWdyYW0oKTsNCisJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtLmVSZXNvdXJjZSgpKTsNCisJCWlmIChmaWxlICE9IG51bGwpIHsNCisJCQlDb21yZWxOYXZpZ2F0b3JJdGVtIGl0ZW0gPSBuZXcgQ29tcmVsTmF2aWdhdG9ySXRlbShkaWFncmFtLCBmaWxlLA0KKwkJCQkJZmFsc2UpOw0KKwkJCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpdGVtKTsNCisJCX0NCisJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhY3RpdmF0ZUVkaXRvcihJV29ya2JlbmNoUGFnZSBhUGFnZSwNCisJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7DQorCQlpZiAoYVNlbGVjdGlvbiA9PSBudWxsIHx8IGFTZWxlY3Rpb24uaXNFbXB0eSgpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJaWYgKGZhbHNlID09IGFTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0pIHsNCisJCQlyZXR1cm47DQorCQl9DQorDQorCQlDb21yZWxBYnN0cmFjdE5hdmlnYXRvckl0ZW0gYWJzdHJhY3ROYXZpZ2F0b3JJdGVtID0gKENvbXJlbEFic3RyYWN0TmF2aWdhdG9ySXRlbSkgYVNlbGVjdGlvbg0KKwkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7DQorCQlWaWV3IG5hdmlnYXRvclZpZXcgPSBudWxsOw0KKwkJaWYgKGFic3RyYWN0TmF2aWdhdG9ySXRlbSBpbnN0YW5jZW9mIENvbXJlbE5hdmlnYXRvckl0ZW0pIHsNCisJCQluYXZpZ2F0b3JWaWV3ID0gKChDb21yZWxOYXZpZ2F0b3JJdGVtKSBhYnN0cmFjdE5hdmlnYXRvckl0ZW0pDQorCQkJCQkuZ2V0VmlldygpOw0KKwkJfSBlbHNlIGlmIChhYnN0cmFjdE5hdmlnYXRvckl0ZW0gaW5zdGFuY2VvZiBDb21yZWxOYXZpZ2F0b3JHcm91cCkgew0KKwkJCUNvbXJlbE5hdmlnYXRvckdyb3VwIG5hdmlnYXRvckdyb3VwID0gKENvbXJlbE5hdmlnYXRvckdyb3VwKSBhYnN0cmFjdE5hdmlnYXRvckl0ZW07DQorCQkJaWYgKG5hdmlnYXRvckdyb3VwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQ29tcmVsTmF2aWdhdG9ySXRlbSkgew0KKwkJCQluYXZpZ2F0b3JWaWV3ID0gKChDb21yZWxOYXZpZ2F0b3JJdGVtKSBuYXZpZ2F0b3JHcm91cA0KKwkJCQkJCS5nZXRQYXJlbnQoKSkuZ2V0VmlldygpOw0KKwkJCX0gZWxzZSBpZiAobmF2aWdhdG9yR3JvdXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7DQorCQkJCW5hdmlnYXRvclZpZXcgPSAoVmlldykgKChJQWRhcHRhYmxlKSBuYXZpZ2F0b3JHcm91cC5nZXRQYXJlbnQoKSkNCisJCQkJCQkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsNCisJCQl9DQorCQl9DQorCQlpZiAobmF2aWdhdG9yVmlldyA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQobmF2aWdhdG9yVmlldy5nZXREaWFncmFtKCkpOw0KKwkJSUVkaXRvclBhcnQgZWRpdG9yID0gYVBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQorCQlpZiAoZWRpdG9yID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlhUGFnZS5icmluZ1RvVG9wKGVkaXRvcik7DQorCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcikgew0KKwkJCURpYWdyYW1FZGl0b3IgZGlhZ3JhbUVkaXRvciA9IChEaWFncmFtRWRpdG9yKSBlZGl0b3I7DQorCQkJUmVzb3VyY2VTZXQgZGlhZ3JhbUVkaXRvclJlc291cmNlU2V0ID0gZGlhZ3JhbUVkaXRvcg0KKwkJCQkJLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOw0KKwkJCUVPYmplY3Qgc2VsZWN0ZWRWaWV3ID0gZGlhZ3JhbUVkaXRvclJlc291cmNlU2V0LmdldEVPYmplY3QoDQorCQkJCQlFY29yZVV0aWwuZ2V0VVJJKG5hdmlnYXRvclZpZXcpLCB0cnVlKTsNCisJCQlpZiAoc2VsZWN0ZWRWaWV3ID09IG51bGwpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCQlHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyID0gKEdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbUVkaXRvcg0KKwkJCQkJLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsNCisJCQlFZGl0UGFydCBzZWxlY3RlZEVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBncmFwaGljYWxWaWV3ZXINCisJCQkJCS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHNlbGVjdGVkVmlldyk7DQorCQkJaWYgKHNlbGVjdGVkRWRpdFBhcnQgIT0gbnVsbCkgew0KKwkJCQlncmFwaGljYWxWaWV3ZXIuc2VsZWN0KHNlbGVjdGVkRWRpdFBhcnQpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JTb3J0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vbmF2aWdhdG9yL0NvbXJlbE5hdmlnYXRvclNvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZWNiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL25hdmlnYXRvci9Db21yZWxOYXZpZ2F0b3JTb3J0ZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsTmF2aWdhdG9yU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUk9VUF9DQVRFR09SWSA9IDcwODY7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRDVVRTX0NBVEVHT1JZID0gNzA4NTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsNCisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcmVsTmF2aWdhdG9ySXRlbSkgew0KKwkJCUNvbXJlbE5hdmlnYXRvckl0ZW0gaXRlbSA9IChDb21yZWxOYXZpZ2F0b3JJdGVtKSBlbGVtZW50Ow0KKwkJCWlmIChpdGVtLmdldFZpZXcoKS5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCisJCQkJcmV0dXJuIFNIT1JUQ1VUU19DQVRFR09SWTsNCisJCQl9DQorCQkJcmV0dXJuIENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoaXRlbS5nZXRWaWV3KCkpOw0KKwkJfQ0KKwkJcmV0dXJuIEdST1VQX0NBVEVHT1JZOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFyc2Vycy9BYnN0cmFjdFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0YjY1MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFyc2Vycy9BYnN0cmFjdFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNDY4IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFyc2VyczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuU2V0VmFsdWVDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0Lk1lc3NhZ2VzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBmaW5hbCBFQXR0cmlidXRlW10gZmVhdHVyZXM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgZmluYWwgRUF0dHJpYnV0ZVtdIGVkaXRhYmxlRmVhdHVyZXM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyB2aWV3UGF0dGVybjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGVkaXRvclBhdHRlcm47DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBlZGl0UGF0dGVybjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBYnN0cmFjdFBhcnNlcihFQXR0cmlidXRlW10gZmVhdHVyZXMpIHsNCisJCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IEFycmF5cy5hc0xpc3QoZmVhdHVyZXMpLmNvbnRhaW5zKG51bGwpKSB7DQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOw0KKwkJfQ0KKwkJdGhpcy5lZGl0YWJsZUZlYXR1cmVzID0gdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWJzdHJhY3RQYXJzZXIoRUF0dHJpYnV0ZVtdIGZlYXR1cmVzLCBFQXR0cmlidXRlW10gZWRpdGFibGVGZWF0dXJlcykgew0KKwkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgQXJyYXlzLmFzTGlzdChmZWF0dXJlcykuY29udGFpbnMobnVsbCkpIHsNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorCQl9DQorCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7DQorCQlpZiAoZWRpdGFibGVGZWF0dXJlcyA9PSBudWxsDQorCQkJCXx8IEFycmF5cy5hc0xpc3QoZWRpdGFibGVGZWF0dXJlcykuY29udGFpbnMobnVsbCkpIHsNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorCQl9DQorCQl0aGlzLmVkaXRhYmxlRmVhdHVyZXMgPSBlZGl0YWJsZUZlYXR1cmVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFZpZXdQYXR0ZXJuKCkgew0KKwkJcmV0dXJuIHZpZXdQYXR0ZXJuOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRWaWV3UGF0dGVybihTdHJpbmcgdmlld1BhdHRlcm4pIHsNCisJCXRoaXMudmlld1BhdHRlcm4gPSB2aWV3UGF0dGVybjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRFZGl0b3JQYXR0ZXJuKCkgew0KKwkJcmV0dXJuIGVkaXRvclBhdHRlcm47DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEVkaXRvclBhdHRlcm4oU3RyaW5nIGVkaXRvclBhdHRlcm4pIHsNCisJCXRoaXMuZWRpdG9yUGF0dGVybiA9IGVkaXRvclBhdHRlcm47DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFBhdHRlcm4oKSB7DQorCQlyZXR1cm4gZWRpdFBhdHRlcm47DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEVkaXRQYXR0ZXJuKFN0cmluZyBlZGl0UGF0dGVybikgew0KKwkJdGhpcy5lZGl0UGF0dGVybiA9IGVkaXRQYXR0ZXJuOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBpc0FmZmVjdGluZ0V2ZW50KE9iamVjdCBldmVudCwgaW50IGZsYWdzKSB7DQorCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsNCisJCQlyZXR1cm4gaXNBZmZlY3RpbmdGZWF0dXJlKCgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpKTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNBZmZlY3RpbmdGZWF0dXJlKE9iamVjdCBmZWF0dXJlKSB7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQorCQkJaWYgKGZlYXR1cmVzW2ldID09IGZlYXR1cmUpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcihJQWRhcHRhYmxlIGVsZW1lbnQpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0VmFsdWVzKEVPYmplY3QgZWxlbWVudCkgew0KKwkJT2JqZWN0W10gdmFsdWVzID0gbmV3IE9iamVjdFtmZWF0dXJlcy5sZW5ndGhdOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KKwkJCXZhbHVlc1tpXSA9IGdldFZhbHVlKGVsZW1lbnQsIGZlYXR1cmVzW2ldKTsNCisJCX0NCisJCXJldHVybiB2YWx1ZXM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBPYmplY3RbXSBnZXRFZGl0YWJsZVZhbHVlcyhFT2JqZWN0IGVsZW1lbnQpIHsNCisJCU9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbZWRpdGFibGVGZWF0dXJlcy5sZW5ndGhdOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0YWJsZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQorCQkJdmFsdWVzW2ldID0gZ2V0VmFsdWUoZWxlbWVudCwgZWRpdGFibGVGZWF0dXJlc1tpXSk7DQorCQl9DQorCQlyZXR1cm4gdmFsdWVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKEVPYmplY3QgZWxlbWVudCwgRUF0dHJpYnV0ZSBmZWF0dXJlKSB7DQorCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7DQorCQlDbGFzcyBpQ2xhc3MgPSBmZWF0dXJlLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpOw0KKwkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoaUNsYXNzKSkgew0KKwkJCWlmICh2YWx1ZSA9PSBudWxsKSB7DQorCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gdmFsdWU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMsDQorCQkJaW50IGZsYWdzKSB7DQorCQlpZiAodmFsdWVzID09IG51bGwNCisJCQkJfHwgdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKS5nZXRDb2RlKCkgIT0gSVBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUpIHsNCisJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsNCisJCX0NCisJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7DQorCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsDQorCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOw0KKwkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgew0KKwkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOw0KKwkJfQ0KKwkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCisJCQkJZWRpdGluZ0RvbWFpbiwgIlNldCBWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJA0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsNCisJCQljb21tYW5kLmNvbXBvc2UoZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LA0KKwkJCQkJZWRpdGFibGVGZWF0dXJlc1tpXSwgdmFsdWVzW2ldKSk7DQorCQl9DQorCQlyZXR1cm4gY29tbWFuZDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElDb21tYW5kIGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoRU9iamVjdCBlbGVtZW50LA0KKwkJCUVBdHRyaWJ1dGUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7DQorCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOw0KKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7DQorCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7DQorCQl9DQorCQlTZXRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgU2V0UmVxdWVzdChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7DQorCQlyZXR1cm4gbmV3IFNldFZhbHVlQ29tbWFuZChyZXF1ZXN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlTmV3VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgew0KKwkJaWYgKHZhbHVlcy5sZW5ndGggIT0gZWRpdGFibGVGZWF0dXJlcy5sZW5ndGgpIHsNCisJCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsNCisJCX0NCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQorCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShlZGl0YWJsZUZlYXR1cmVzW2ldLCB2YWx1ZXNbaV0pOw0KKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgew0KKwkJCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwNCisJCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWROZXdWYWx1ZShFQXR0cmlidXRlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgew0KKwkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsNCisJCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7DQorCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7DQorCQkJaWYgKEJvb2xlYW4uVFlQRS5lcXVhbHMoaUNsYXNzKSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7DQorCQkJCQkvLyBvaw0KKwkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQl2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSB2YWx1ZSk7DQorCQkJCX0gZWxzZSB7DQorCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoTkxTLmJpbmQoDQorCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1VuZXhwZWN0ZWRWYWx1ZVR5cGUsDQorCQkJCQkJCWlDbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7DQorCQkJCQkvLyBvaw0KKwkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOw0KKwkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgew0KKwkJCQkJCXZhbHVlID0gbnVsbDsNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKTsNCisJCQkJCX0NCisJCQkJfSBlbHNlIHsNCisJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZShOTFMuYmluZCgNCisJCQkJCQkJTWVzc2FnZXMuQWJzdHJhY3RQYXJzZXJfVW5leHBlY3RlZFZhbHVlVHlwZSwNCisJCQkJCQkJaUNsYXNzLmdldE5hbWUoKSkpOw0KKwkJCQl9DQorCQkJfSBlbHNlIGlmIChCeXRlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsNCisJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZSkgew0KKwkJCQkJLy8gb2sNCisJCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgew0KKwkJCQkJdmFsdWUgPSBuZXcgQnl0ZSgoKE51bWJlcikgdmFsdWUpLmJ5dGVWYWx1ZSgpKTsNCisJCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsNCisJCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsNCisJCQkJCQl2YWx1ZSA9IG51bGw7DQorCQkJCQl9IGVsc2Ugew0KKwkJCQkJCXRyeSB7DQorCQkJCQkJCXZhbHVlID0gQnl0ZS52YWx1ZU9mKHMpOw0KKwkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsNCisJCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKA0KKwkJCQkJCQkJCU5MUy5iaW5kKA0KKwkJCQkJCQkJCQkJTWVzc2FnZXMuQWJzdHJhY3RQYXJzZXJfV3JvbmdTdHJpbmdDb252ZXJzaW9uLA0KKwkJCQkJCQkJCQkJaUNsYXNzLmdldE5hbWUoKSkpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfSBlbHNlIHsNCisJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZShOTFMuYmluZCgNCisJCQkJCQkJTWVzc2FnZXMuQWJzdHJhY3RQYXJzZXJfVW5leHBlY3RlZFZhbHVlVHlwZSwNCisJCQkJCQkJaUNsYXNzLmdldE5hbWUoKSkpOw0KKwkJCQl9DQorCQkJfSBlbHNlIGlmIChTaG9ydC5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7DQorCQkJCQkvLyBvaw0KKwkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7DQorCQkJCQl2YWx1ZSA9IG5ldyBTaG9ydCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7DQorCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7DQorCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7DQorCQkJCQkJdmFsdWUgPSBudWxsOw0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQl0cnkgew0KKwkJCQkJCQl2YWx1ZSA9IFNob3J0LnZhbHVlT2Yocyk7DQorCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgew0KKwkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoDQorCQkJCQkJCQkJTkxTLmJpbmQoDQorCQkJCQkJCQkJCQlNZXNzYWdlcy5BYnN0cmFjdFBhcnNlcl9Xcm9uZ1N0cmluZ0NvbnZlcnNpb24sDQorCQkJCQkJCQkJCQlpQ2xhc3MuZ2V0TmFtZSgpKSk7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKE5MUy5iaW5kKA0KKwkJCQkJCQlNZXNzYWdlcy5BYnN0cmFjdFBhcnNlcl9VbmV4cGVjdGVkVmFsdWVUeXBlLA0KKwkJCQkJCQlpQ2xhc3MuZ2V0TmFtZSgpKSk7DQorCQkJCX0NCisJCQl9IGVsc2UgaWYgKEludGVnZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7DQorCQkJCQkvLyBvaw0KKwkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7DQorCQkJCQl2YWx1ZSA9IG5ldyBJbnRlZ2VyKCgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKSk7DQorCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7DQorCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7DQorCQkJCQkJdmFsdWUgPSBudWxsOw0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQl0cnkgew0KKwkJCQkJCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZihzKTsNCisJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7DQorCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgNCisJCQkJCQkJCQlOTFMuYmluZCgNCisJCQkJCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1dyb25nU3RyaW5nQ29udmVyc2lvbiwNCisJCQkJCQkJCQkJCWlDbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0gZWxzZSB7DQorCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoTkxTLmJpbmQoDQorCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1VuZXhwZWN0ZWRWYWx1ZVR5cGUsDQorCQkJCQkJCWlDbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSBpZiAoTG9uZy5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsNCisJCQkJCS8vIG9rDQorCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsNCisJCQkJCXZhbHVlID0gbmV3IExvbmcoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7DQorCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisJCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7DQorCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7DQorCQkJCQkJdmFsdWUgPSBudWxsOw0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQl0cnkgew0KKwkJCQkJCQl2YWx1ZSA9IExvbmcudmFsdWVPZihzKTsNCisJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7DQorCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgNCisJCQkJCQkJCQlOTFMuYmluZCgNCisJCQkJCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1dyb25nU3RyaW5nQ29udmVyc2lvbiwNCisJCQkJCQkJCQkJCWlDbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0gZWxzZSB7DQorCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoTkxTLmJpbmQoDQorCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1VuZXhwZWN0ZWRWYWx1ZVR5cGUsDQorCQkJCQkJCWlDbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSBpZiAoRmxvYXQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgew0KKwkJCQkJLy8gb2sNCisJCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgew0KKwkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOw0KKwkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOw0KKwkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgew0KKwkJCQkJCXZhbHVlID0gbnVsbDsNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJdHJ5IHsNCisJCQkJCQkJdmFsdWUgPSBGbG9hdC52YWx1ZU9mKHMpOw0KKwkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsNCisJCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKA0KKwkJCQkJCQkJCU5MUy5iaW5kKA0KKwkJCQkJCQkJCQkJTWVzc2FnZXMuQWJzdHJhY3RQYXJzZXJfV3JvbmdTdHJpbmdDb252ZXJzaW9uLA0KKwkJCQkJCQkJCQkJaUNsYXNzLmdldE5hbWUoKSkpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfSBlbHNlIHsNCisJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZShOTFMuYmluZCgNCisJCQkJCQkJTWVzc2FnZXMuQWJzdHJhY3RQYXJzZXJfVW5leHBlY3RlZFZhbHVlVHlwZSwNCisJCQkJCQkJaUNsYXNzLmdldE5hbWUoKSkpOw0KKwkJCQl9DQorCQkJfSBlbHNlIGlmIChEb3VibGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgew0KKwkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpIHsNCisJCQkJCS8vIG9rDQorCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsNCisJCQkJCXZhbHVlID0gbmV3IERvdWJsZSgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOw0KKwkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOw0KKwkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgew0KKwkJCQkJCXZhbHVlID0gbnVsbDsNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJdHJ5IHsNCisJCQkJCQkJdmFsdWUgPSBEb3VibGUudmFsdWVPZihzKTsNCisJCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7DQorCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgNCisJCQkJCQkJCQlOTFMuYmluZCgNCisJCQkJCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1dyb25nU3RyaW5nQ29udmVyc2lvbiwNCisJCQkJCQkJCQkJCWlDbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0gZWxzZSB7DQorCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoTkxTLmJpbmQoDQorCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1VuZXhwZWN0ZWRWYWx1ZVR5cGUsDQorCQkJCQkJCWlDbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEVFbnVtKSB7DQorCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKwkJCQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSAoKEVFbnVtKSB0eXBlKQ0KKwkJCQkJCQkuZ2V0RUVudW1MaXRlcmFsQnlMaXRlcmFsKChTdHJpbmcpIHZhbHVlKTsNCisJCQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsNCisJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoTkxTLmJpbmQoDQorCQkJCQkJCQlNZXNzYWdlcy5BYnN0cmFjdFBhcnNlcl9Vbmtub3duTGl0ZXJhbCwgdmFsdWUpKTsNCisJCQkJCX0gZWxzZSB7DQorCQkJCQkJdmFsdWUgPSBsaXRlcmFsLmdldEluc3RhbmNlKCk7DQorCQkJCQl9DQorCQkJCX0gZWxzZSB7DQorCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoTkxTLmJpbmQoDQorCQkJCQkJCU1lc3NhZ2VzLkFic3RyYWN0UGFyc2VyX1VuZXhwZWN0ZWRWYWx1ZVR5cGUsDQorCQkJCQkJCVN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXJldHVybiB2YWx1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGNsYXNzIEludmFsaWRWYWx1ZSB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEludmFsaWRWYWx1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsNCisJCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCQlyZXR1cm4gZGVzY3JpcHRpb247DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJzZXJzL01lc3NhZ2VGb3JtYXRQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFyc2Vycy9NZXNzYWdlRm9ybWF0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1ZjdlZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFyc2Vycy9NZXNzYWdlRm9ybWF0UGFyc2VyLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJzZXJzOw0KKw0KK2ltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsNCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQoraW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5NZXNzYWdlczsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE1lc3NhZ2VGb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFN0cmluZyBkZWZhdWx0UGF0dGVybjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRFZGl0YWJsZVBhdHRlcm47DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgdmlld1Byb2Nlc3NvcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTWVzc2FnZUZvcm1hdCBlZGl0b3JQcm9jZXNzb3I7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZWRpdFByb2Nlc3NvcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNZXNzYWdlRm9ybWF0UGFyc2VyKEVBdHRyaWJ1dGVbXSBmZWF0dXJlcykgew0KKwkJc3VwZXIoZmVhdHVyZXMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTWVzc2FnZUZvcm1hdFBhcnNlcihFQXR0cmlidXRlW10gZmVhdHVyZXMsDQorCQkJRUF0dHJpYnV0ZVtdIGVkaXRhYmxlRmVhdHVyZXMpIHsNCisJCXN1cGVyKGZlYXR1cmVzLCBlZGl0YWJsZUZlYXR1cmVzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UGF0dGVybigpIHsNCisJCWlmIChkZWZhdWx0UGF0dGVybiA9PSBudWxsKSB7DQorCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCisJCQkJaWYgKGkgPiAwKSB7DQorCQkJCQlzYi5hcHBlbmQoJyAnKTsNCisJCQkJfQ0KKwkJCQlzYi5hcHBlbmQoJ3snKTsNCisJCQkJc2IuYXBwZW5kKGkpOw0KKwkJCQlzYi5hcHBlbmQoJ30nKTsNCisJCQl9DQorCQkJZGVmYXVsdFBhdHRlcm4gPSBzYi50b1N0cmluZygpOw0KKwkJfQ0KKwkJcmV0dXJuIGRlZmF1bHRQYXR0ZXJuOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRWaWV3UGF0dGVybihTdHJpbmcgdmlld1BhdHRlcm4pIHsNCisJCXN1cGVyLnNldFZpZXdQYXR0ZXJuKHZpZXdQYXR0ZXJuKTsNCisJCXZpZXdQcm9jZXNzb3IgPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXR0ZXJuKFN0cmluZyBlZGl0b3JQYXR0ZXJuKSB7DQorCQlzdXBlci5zZXRFZGl0b3JQYXR0ZXJuKGVkaXRvclBhdHRlcm4pOw0KKwkJZWRpdG9yUHJvY2Vzc29yID0gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsNCisJCWlmICh2aWV3UHJvY2Vzc29yID09IG51bGwpIHsNCisJCQl2aWV3UHJvY2Vzc29yID0gbmV3IE1lc3NhZ2VGb3JtYXQoDQorCQkJCQlnZXRWaWV3UGF0dGVybigpID09IG51bGwgPyBnZXREZWZhdWx0UGF0dGVybigpDQorCQkJCQkJCTogZ2V0Vmlld1BhdHRlcm4oKSk7DQorCQl9DQorCQlyZXR1cm4gdmlld1Byb2Nlc3NvcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdG9yUHJvY2Vzc29yKCkgew0KKwkJaWYgKGVkaXRvclByb2Nlc3NvciA9PSBudWxsKSB7DQorCQkJZWRpdG9yUHJvY2Vzc29yID0gbmV3IE1lc3NhZ2VGb3JtYXQoDQorCQkJCQlnZXRFZGl0b3JQYXR0ZXJuKCkgPT0gbnVsbCA/IGdldERlZmF1bHRFZGl0YWJsZVBhdHRlcm4oKQ0KKwkJCQkJCQk6IGdldEVkaXRvclBhdHRlcm4oKSk7DQorCQl9DQorCQlyZXR1cm4gZWRpdG9yUHJvY2Vzc29yOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRFZGl0YWJsZVBhdHRlcm4oKSB7DQorCQlpZiAoZGVmYXVsdEVkaXRhYmxlUGF0dGVybiA9PSBudWxsKSB7DQorCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdGFibGVGZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KKwkJCQlpZiAoaSA+IDApIHsNCisJCQkJCXNiLmFwcGVuZCgnICcpOw0KKwkJCQl9DQorCQkJCXNiLmFwcGVuZCgneycpOw0KKwkJCQlzYi5hcHBlbmQoaSk7DQorCQkJCXNiLmFwcGVuZCgnfScpOw0KKwkJCX0NCisJCQlkZWZhdWx0RWRpdGFibGVQYXR0ZXJuID0gc2IudG9TdHJpbmcoKTsNCisJCX0NCisJCXJldHVybiBkZWZhdWx0RWRpdGFibGVQYXR0ZXJuOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRFZGl0UGF0dGVybihTdHJpbmcgZWRpdFBhdHRlcm4pIHsNCisJCXN1cGVyLnNldEVkaXRQYXR0ZXJuKGVkaXRQYXR0ZXJuKTsNCisJCWVkaXRQcm9jZXNzb3IgPSBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgew0KKwkJaWYgKGVkaXRQcm9jZXNzb3IgPT0gbnVsbCkgew0KKwkJCWVkaXRQcm9jZXNzb3IgPSBuZXcgTWVzc2FnZUZvcm1hdCgNCisJCQkJCWdldEVkaXRQYXR0ZXJuKCkgPT0gbnVsbCA/IGdldERlZmF1bHRFZGl0YWJsZVBhdHRlcm4oKQ0KKwkJCQkJCQk6IGdldEVkaXRQYXR0ZXJuKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIGVkaXRQcm9jZXNzb3I7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgew0KKwkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsNCisJCXJldHVybiBnZXRFZGl0b3JQcm9jZXNzb3IoKS5mb3JtYXQoZ2V0RWRpdGFibGVWYWx1ZXMoZWxlbWVudCksDQorCQkJCW5ldyBTdHJpbmdCdWZmZXIoKSwgbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUGFyc2VyRWRpdFN0YXR1cyBpc1ZhbGlkRWRpdFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsDQorCQkJU3RyaW5nIGVkaXRTdHJpbmcpIHsNCisJCVBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7DQorCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UoZWRpdFN0cmluZywgcG9zKTsNCisJCWlmICh2YWx1ZXMgPT0gbnVsbCkgew0KKwkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLklELA0KKwkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgTkxTLmJpbmQoDQorCQkJCQkJCU1lc3NhZ2VzLk1lc3NhZ2VGb3JtYXRQYXJzZXJfSW52YWxpZElucHV0RXJyb3IsDQorCQkJCQkJCW5ldyBJbnRlZ2VyKHBvcy5nZXRFcnJvckluZGV4KCkpKSk7DQorCQl9DQorCQlyZXR1cm4gdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIFN0cmluZyBuZXdTdHJpbmcsDQorCQkJaW50IGZsYWdzKSB7DQorCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UobmV3U3RyaW5nLA0KKwkJCQluZXcgUGFyc2VQb3NpdGlvbigwKSk7DQorCQlyZXR1cm4gZ2V0UGFyc2VDb21tYW5kKGFkYXB0ZXIsIHZhbHVlcywgZmxhZ3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFByaW50U3RyaW5nKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzKSB7DQorCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOw0KKwkJcmV0dXJuIGdldFZpZXdQcm9jZXNzb3IoKS5mb3JtYXQoZ2V0VmFsdWVzKGVsZW1lbnQpLA0KKwkJCQluZXcgU3RyaW5nQnVmZmVyKCksIG5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxDcmVhdGlvbldpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbENyZWF0aW9uV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkYjI5NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxDcmVhdGlvbldpemFyZC5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydDsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7DQorDQorCXByaXZhdGUgQ29tcmVsQ3VzdG9tQ3JlYXRpb25XaXphcmRQYWdlIGN1c3RvbVBhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21yZWxDcmVhdGlvbldpemFyZFBhZ2UgZGlhZ3JhbU1vZGVsRmlsZVBhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcmVsQ3JlYXRpb25XaXphcmRQYWdlIGRvbWFpbk1vZGVsRmlsZVBhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUmVzb3VyY2UgZGlhZ3JhbTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IHRydWU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7DQorCQlyZXR1cm4gd29ya2JlbmNoOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgew0KKwkJcmV0dXJuIHNlbGVjdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGZpbmFsIFJlc291cmNlIGdldERpYWdyYW0oKSB7DQorCQlyZXR1cm4gZGlhZ3JhbTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpIHsNCisJCXJldHVybiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0T3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoDQorCQkJYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcikgew0KKwkJdGhpcy5vcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOw0KKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247DQorCQlzZXRXaW5kb3dUaXRsZShNZXNzYWdlcy5Db21yZWxDcmVhdGlvbldpemFyZFRpdGxlKTsNCisJCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4NCisJCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoImljb25zL3dpemJhbi9OZXdDb21yZWxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkDQorCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgew0KKw0KKwkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UgPSBuZXcgQ29tcmVsQ3JlYXRpb25XaXphcmRQYWdlKA0KKwkJCQkiRGlhZ3JhbU1vZGVsRmlsZSIsIGdldFNlbGVjdGlvbigpLCAiY29tcmVsX2RpYWdyYW0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQorCQlkaWFncmFtTW9kZWxGaWxlUGFnZQ0KKwkJCQkuc2V0VGl0bGUoTWVzc2FnZXMuQ29tcmVsQ3JlYXRpb25XaXphcmRfRGlhZ3JhbU1vZGVsRmlsZVBhZ2VUaXRsZSk7DQorCQlkaWFncmFtTW9kZWxGaWxlUGFnZQ0KKwkJCQkuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuQ29tcmVsQ3JlYXRpb25XaXphcmRfRGlhZ3JhbU1vZGVsRmlsZVBhZ2VEZXNjcmlwdGlvbik7DQorCQlhZGRQYWdlKGRpYWdyYW1Nb2RlbEZpbGVQYWdlKTsNCisNCisJCWRvbWFpbk1vZGVsRmlsZVBhZ2UgPSBuZXcgQ29tcmVsQ3JlYXRpb25XaXphcmRQYWdlKA0KKwkJCQkiRG9tYWluTW9kZWxGaWxlIiwgZ2V0U2VsZWN0aW9uKCksICJjb21yZWwiKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KKw0KKwkJCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQorCQkJCWlmICh2aXNpYmxlKSB7DQorCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBkaWFncmFtTW9kZWxGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOw0KKwkJCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkNCisJCQkJCQkJLSAiLmNvbXJlbF9kaWFncmFtIi5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJCXNldEZpbGVOYW1lKENvbXJlbERpYWdyYW1FZGl0b3JVdGlsLmdldFVuaXF1ZUZpbGVOYW1lKA0KKwkJCQkJCQlnZXRDb250YWluZXJGdWxsUGF0aCgpLCBmaWxlTmFtZSwgImNvbXJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQl9DQorCQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7DQorCQkJfQ0KKwkJfTsNCisJCWRvbWFpbk1vZGVsRmlsZVBhZ2UNCisJCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkNvbXJlbENyZWF0aW9uV2l6YXJkX0RvbWFpbk1vZGVsRmlsZVBhZ2VUaXRsZSk7DQorCQlkb21haW5Nb2RlbEZpbGVQYWdlDQorCQkJCS5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5Db21yZWxDcmVhdGlvbldpemFyZF9Eb21haW5Nb2RlbEZpbGVQYWdlRGVzY3JpcHRpb24pOw0KKwkJYWRkUGFnZShkb21haW5Nb2RlbEZpbGVQYWdlKTsNCisJCWN1c3RvbVBhZ2UgPSBuZXcgQ29tcmVsQ3VzdG9tQ3JlYXRpb25XaXphcmRQYWdlKA0KKwkJCQkiQ29tcG9zaXRlIFJlZmFjdG9yaW5nIERldGFpbHMiKTsNCisJCWN1c3RvbVBhZ2Uuc2V0VGl0bGUoIkNvbXBvc2l0ZSBSZWZhY3RvcmluZyBEZXRhaWxzIik7DQorCQlhZGRQYWdlKGN1c3RvbVBhZ2UpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsNCisJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24obnVsbCkgew0KKw0KKwkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KKwkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsNCisJCQkJZGlhZ3JhbSA9IENvbXJlbERpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oDQorCQkJCQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UuZ2V0VVJJKCksIGRvbWFpbk1vZGVsRmlsZVBhZ2UNCisJCQkJCQkJCS5nZXRVUkkoKSwgbW9uaXRvciwgY3VzdG9tUGFnZS5nZXREaWFncmFtTmFtZSgpDQorCQkJCQkJCQkuZ2V0VGV4dCgpLCBjdXN0b21QYWdlLmdldE5hbWVzcGFjZVVSSSgpDQorCQkJCQkJCQkuZ2V0VGV4dCgpLCBjdXN0b21QYWdlDQorCQkJCQkJCQkuZ2V0Q29ubmVjdGlvblZpc3VhbGl6YXRpb24oKS5nZXRUZXh0KCkpOw0KKwkJCQlpZiAoaXNPcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcigpICYmIGRpYWdyYW0gIT0gbnVsbCkgew0KKwkJCQkJdHJ5IHsNCisJCQkJCQlDb21yZWxEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtKTsNCisJCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsNCisJCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwNCisJCQkJCQkJCU1lc3NhZ2VzLkNvbXJlbENyZWF0aW9uV2l6YXJkT3BlbkVkaXRvckVycm9yLA0KKwkJCQkJCQkJbnVsbCwgZS5nZXRTdGF0dXMoKSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKwkJdHJ5IHsNCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsNCisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCisJCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsNCisJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksDQorCQkJCQkJTWVzc2FnZXMuQ29tcmVsQ3JlYXRpb25XaXphcmRDcmVhdGlvbkVycm9yLCBudWxsLA0KKwkJCQkJCSgoQ29yZUV4Y2VwdGlvbikgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkpOw0KKwkJCX0gZWxzZSB7DQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCQkiRXJyb3IgY3JlYXRpbmcgZGlhZ3JhbSIsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCXJldHVybiBkaWFncmFtICE9IG51bGw7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzEzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsQ3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRXh0ZW5zaW9uOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbENyZWF0aW9uV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsDQorCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZmlsZUV4dGVuc2lvbikgew0KKwkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7DQorCQl0aGlzLmZpbGVFeHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uOw0KKwl9DQorDQorCS8qKg0KKwkgKiBPdmVycmlkZSB0byBjcmVhdGUgZmlsZXMgd2l0aCB0aGlzIGV4dGVuc2lvbi4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgew0KKwkJcmV0dXJuIGZpbGVFeHRlbnNpb247DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBVUkkgZ2V0VVJJKCkgew0KKwkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGdldEZpbGVQYXRoKCkudG9TdHJpbmcoKSwgZmFsc2UpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVBhdGggZ2V0RmlsZVBhdGgoKSB7DQorCQlJUGF0aCBwYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsNCisJCWlmIChwYXRoID09IG51bGwpIHsNCisJCQlwYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOw0KKwkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsNCisJCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOw0KKwkJfQ0KKwkJcmV0dXJuIHBhdGg7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOw0KKwkJc2V0RmlsZU5hbWUoQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwuZ2V0VW5pcXVlRmlsZU5hbWUoDQorCQkJCWdldENvbnRhaW5lckZ1bGxQYXRoKCksIGdldEZpbGVOYW1lKCksIGdldEV4dGVuc2lvbigpKSk7DQorCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7DQorCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigpOw0KKwkJaWYgKGV4dGVuc2lvbiAhPSBudWxsDQorCQkJCSYmICFnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi4iICsgZXh0ZW5zaW9uKSkgew0KKwkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgNCisJCQkJCU1lc3NhZ2VzLkNvbXJlbENyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbkVycm9yLCBleHRlbnNpb24pKTsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsQ3VzdG9tQ3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsQ3VzdG9tQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkZDYzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxDdXN0b21DcmVhdGlvbldpemFyZFBhZ2UuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuTWFwcGluZ1Zpc3VhbGl6YXRpb247DQoraW1wb3J0IGNvbXJlbC51dGlsLlJlZ2lzdHJ5VXRpbDsNCisNCitwdWJsaWMgY2xhc3MgQ29tcmVsQ3VzdG9tQ3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7DQorDQorCXByaXZhdGUgQ29tYm8gbmFtZXNwYWNlVVJJOw0KKwkNCisJcHJpdmF0ZSBUZXh0IGRpYWdyYW1OYW1lOw0KKwkNCisJcHJpdmF0ZSBDb21ibyBjb25uZWN0aW9uVmlzdWFsaXphdGlvbjsNCisJDQorCXByb3RlY3RlZCBDb21yZWxDdXN0b21DcmVhdGlvbldpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7DQorCQlzdXBlcihwYWdlTmFtZSk7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsNCisJCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOw0KKwkgICAgaW50IG5jb2wgPSAzOw0KKwkgICAgZ2wubnVtQ29sdW1ucyA9IG5jb2w7DQorCSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkgICAgbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJEaWFncmFtIE5hbWU6Iik7CQkNCisJICAgIGRpYWdyYW1OYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7DQorCSAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2wgLSAxOw0KKwkgICAgZGlhZ3JhbU5hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQorCSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOw0KKwkgICAgSVdpemFyZFBhZ2UgcHJlUGFnZSA9IHRoaXMuZ2V0UHJldmlvdXNQYWdlKCk7DQorCSAgICBpZihwcmVQYWdlIGluc3RhbmNlb2YgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSkgew0KKwkgICAgCVdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgcCA9IChXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKXByZVBhZ2U7DQorCSAgICAJU3RyaW5nIGZpbGVuYW1lID0gcC5nZXRGaWxlTmFtZSgpOw0KKwkgICAgCVN0cmluZyBzdWJTdHJpbmcgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCxmaWxlbmFtZS5sZW5ndGgoKS0xOCk7DQorCSAgICAJZGlhZ3JhbU5hbWUuc2V0VGV4dChzdWJTdHJpbmcpOw0KKwkgICAgfQ0KKwkgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOw0KKwkgICAgZ3JpZERhdGEubWluaW11bVdpZHRoID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOw0KKwkgICAgbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJOYW1lc3BhY2VVUkk6Iik7CQkJCQkJDQorCSAgICBuYW1lc3BhY2VVUkkgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7DQorCSAgIAlmb3IoU3RyaW5nIHM6IFJlZ2lzdHJ5VXRpbC5nZXROYW1lcHNhY2VVUklTKCkpIHsNCisJICAgCQluYW1lc3BhY2VVUkkuYWRkKHMpOw0KKwkgICAJfQ0KKwkgICAgbmFtZXNwYWNlVVJJLnNldExheW91dERhdGEoZ3JpZERhdGEpOw0KKwkgICAgbmFtZXNwYWNlVVJJLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBNeUxpc3RlbmVyKCkpOw0KKwkgICAgDQorCSAgICBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkNvbm5lY3Rpb24gVmlzdWFsaXphdGlvbjoiKTsNCisJICAgIGNvbm5lY3Rpb25WaXN1YWxpemF0aW9uID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOw0KKwkgICAgZm9yKE1hcHBpbmdWaXN1YWxpemF0aW9uIG0gOiBNYXBwaW5nVmlzdWFsaXphdGlvbi52YWx1ZXMoKSkgew0KKwkgICAgCWNvbm5lY3Rpb25WaXN1YWxpemF0aW9uLmFkZChtLmdldExpdGVyYWwoKSk7DQorCSAgICB9DQorCSAgICBpZihjb25uZWN0aW9uVmlzdWFsaXphdGlvbi5nZXRJdGVtQ291bnQoKT4wKSB7DQorCSAgICAJY29ubmVjdGlvblZpc3VhbGl6YXRpb24uc2VsZWN0KDApOw0KKwkgICAgfQ0KKwkgICAgY29ubmVjdGlvblZpc3VhbGl6YXRpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQorCSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsNCisJICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsJICAgIA0KKwl9CQ0KKw0KKwlwdWJsaWMgQ29tYm8gZ2V0TmFtZXNwYWNlVVJJKCkgew0KKwkJcmV0dXJuIG5hbWVzcGFjZVVSSTsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoQ29tYm8gbmFtZXNwYWNlVVJJKSB7DQorCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsNCisJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRoaXMuaXNQYWdlQ29tcGxldGUoKSk7DQorCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7DQorCX0NCisNCisJcHVibGljIFRleHQgZ2V0RGlhZ3JhbU5hbWUoKSB7DQorCQlyZXR1cm4gZGlhZ3JhbU5hbWU7DQorCX0NCisNCisJcHVibGljIHZvaWQgc2V0RGlhZ3JhbU5hbWUoVGV4dCBkaWFncmFtTmFtZSkgew0KKwkJdGhpcy5kaWFncmFtTmFtZSA9IGRpYWdyYW1OYW1lOw0KKwl9DQorDQorCXB1YmxpYyBDb21ibyBnZXRDb25uZWN0aW9uVmlzdWFsaXphdGlvbigpIHsNCisJCXJldHVybiBjb25uZWN0aW9uVmlzdWFsaXphdGlvbjsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVmlzdWFsaXphdGlvbihDb21ibyBjb25uZWN0aW9uVmlzdWFsaXphdGlvbikgew0KKwkJdGhpcy5jb25uZWN0aW9uVmlzdWFsaXphdGlvbiA9IGNvbm5lY3Rpb25WaXN1YWxpemF0aW9uOw0KKwl9CQ0KKwkNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgew0KKwkJcmV0dXJuIHZhbGlkYXRlUGFnZSgpICYmIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHNldFBhZ2VDb21wbGV0ZShib29sZWFuIGNvbXBsZXRlKSB7DQorCQlzdXBlci5zZXRQYWdlQ29tcGxldGUoY29tcGxldGUpOw0KKwl9DQorCQ0KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKXsNCisJCWlmKHRoaXMuZ2V0TmFtZXNwYWNlVVJJKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKT09LTEpIHsNCisJCQlzZXRFcnJvck1lc3NhZ2UoIk5hbXNwYWNlVVJJIG11c3QgYmUgc2V0Iik7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0JDQorDQorCXByaXZhdGUgY2xhc3MgTXlMaXN0ZW5lciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyew0KKw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgew0KKwkJICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7DQorCQkgICAgZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOw0KKwkJICAgIA0KKwkJfQ0KKwkJDQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWZlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLkVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzDQorCQlEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3Igew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENsYXNzIGdldEVkaXRvckNsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbERpYWdyYW1FZGl0b3IuY2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySWQoKSB7DQorCQlyZXR1cm4gQ29tcmVsRGlhZ3JhbUVkaXRvci5JRDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKSB7DQorCQlzdXBlci5pbml0KGJhcnMsIHBhZ2UpOw0KKwkJLy8gcHJpbnQgcHJldmlldw0KKwkJSU1lbnVNYW5hZ2VyIGZpbGVNZW51ID0gYmFycy5nZXRNZW51TWFuYWdlcigpLmZpbmRNZW51VXNpbmdQYXRoKA0KKwkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRklMRSk7DQorCQlhc3NlcnQgZmlsZU1lbnUgIT0gbnVsbDsNCisJCUlBY3Rpb24gcHJpbnRQcmV2aWV3QWN0aW9uID0gbmV3IFJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uKA0KKwkJCQluZXcgRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcigpKTsNCisJCWZpbGVNZW51Lmluc2VydEJlZm9yZSgicHJpbnQiLCBwcmludFByZXZpZXdBY3Rpb24pOyAvLyROT04tTkxTLTEkDQorCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBiYXJzLmdldE1lbnVNYW5hZ2VyKCkuZmluZE1lbnVVc2luZ1BhdGgoDQorCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsNCisJCWFzc2VydCBlZGl0TWVudSAhPSBudWxsOw0KKwkJaWYgKGVkaXRNZW51LmZpbmQoInZhbGlkYXRpb25Hcm91cCIpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoInZhbGlkYXRpb25Hcm91cCIpKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJSUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZUFjdGlvbihwYWdlKTsNCisJCWVkaXRNZW51LmFwcGVuZFRvR3JvdXAoInZhbGlkYXRpb25Hcm91cCIsIHZhbGlkYXRlQWN0aW9uKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEaWFncmFtRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRGlhZ3JhbUVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTdiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRGlhZ3JhbUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMzkzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLm1hcmtlci5NYXJrZXJOYXZpZ2F0aW9uU2VydmljZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRHJvcFRhcmdldExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLlByb2plY3RFeHBsb3JlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ubmF2aWdhdG9yLkNvbXJlbE5hdmlnYXRvckl0ZW07DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxEaWFncmFtRWRpdG9yIGV4dGVuZHMgRGlhZ3JhbURvY3VtZW50RWRpdG9yIGltcGxlbWVudHMNCisJCUlHb3RvTWFya2VyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJA0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9JRCA9ICJjb21yZWwuZGlhZ3JhbS51aS5kaWFncmFtQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxEaWFncmFtRWRpdG9yKCkgew0KKwkJc3VwZXIodHJ1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dElEKCkgew0KKwkJcmV0dXJuIENPTlRFWFRfSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBQYWxldHRlUm9vdCBjcmVhdGVQYWxldHRlUm9vdChQYWxldHRlUm9vdCBleGlzdGluZ1BhbGV0dGVSb290KSB7DQorCQlQYWxldHRlUm9vdCByb290ID0gc3VwZXIuY3JlYXRlUGFsZXR0ZVJvb3QoZXhpc3RpbmdQYWxldHRlUm9vdCk7DQorCQluZXcgQ29tcmVsUGFsZXR0ZUZhY3RvcnkoKS5maWxsUGFsZXR0ZShyb290KTsNCisJCXJldHVybiByb290Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsNCisJCXJldHVybiBDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkgew0KKwkJcmV0dXJuIENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKSB7DQorCQlpZiAodHlwZSA9PSBJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcykgew0KKwkJCXJldHVybiBuZXcgSVNob3dJblRhcmdldExpc3QoKSB7DQorCQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRTaG93SW5UYXJnZXRJZHMoKSB7DQorCQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQgfTsNCisJCQkJfQ0KKwkJCX07DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7DQorCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0DQorCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsNCisJCQlyZXR1cm4gQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsNCisJCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCA/IGdldERvY3VtZW50UHJvdmlkZXIoKQ0KKwkJCQkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSkgOiBudWxsOw0KKwkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgew0KKwkJCXJldHVybiAoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRFZGl0aW5nRG9tYWluKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0RWRpdGluZ0RvbWFpbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgew0KKwkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dA0KKwkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7DQorCQkJc2V0RG9jdW1lbnRQcm92aWRlcihDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkNCisJCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCkpOw0KKwkJfSBlbHNlIHsNCisJCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgew0KKwkJTWFya2VyTmF2aWdhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nb3RvTWFya2VyKHRoaXMsIG1hcmtlcik7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsNCisJCXBlcmZvcm1TYXZlQXMobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TYXZlQXMoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCisJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7DQorCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOw0KKwkJU2F2ZUFzRGlhbG9nIGRpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coc2hlbGwpOw0KKwkJSUZpbGUgb3JpZ2luYWwgPSBpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgPyAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KQ0KKwkJCQkuZ2V0RmlsZSgpIDogbnVsbDsNCisJCWlmIChvcmlnaW5hbCAhPSBudWxsKSB7DQorCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbCk7DQorCQl9DQorCQlkaWFsb2cuY3JlYXRlKCk7DQorCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsNCisJCWlmIChwcm92aWRlciA9PSBudWxsKSB7DQorCQkJLy8gZWRpdG9yIGhhcyBiZWVuIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkIHdoaWxlIHRoZSBkaWFsb2cgd2FzIG9wZW4NCisJCQlyZXR1cm47DQorCQl9DQorCQlpZiAocHJvdmlkZXIuaXNEZWxldGVkKGlucHV0KSAmJiBvcmlnaW5hbCAhPSBudWxsKSB7DQorCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgNCisJCQkJCU1lc3NhZ2VzLkNvbXJlbERpYWdyYW1FZGl0b3JfU2F2aW5nRGVsZXRlZEZpbGUsDQorCQkJCQlvcmlnaW5hbC5nZXROYW1lKCkpOw0KKwkJCWRpYWxvZy5zZXRFcnJvck1lc3NhZ2UobnVsbCk7DQorCQkJZGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsNCisJCX0NCisJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsNCisJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsNCisJCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOw0KKwkJCX0NCisJCQlyZXR1cm47DQorCQl9DQorCQlJUGF0aCBmaWxlUGF0aCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsNCisJCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7DQorCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7DQorCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsNCisJCQl9DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7DQorCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGZpbGVQYXRoKTsNCisJCWZpbmFsIElFZGl0b3JJbnB1dCBuZXdJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSk7DQorCQkvLyBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgb3Blbg0KKwkJSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgbWF0Y2hpbmdTdHJhdGVneSA9IGdldEVkaXRvckRlc2NyaXB0b3IoKQ0KKwkJCQkuZ2V0RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSgpOw0KKwkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQorCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkNCisJCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgew0KKwkJCWlmIChtYXRjaGluZ1N0cmF0ZWd5Lm1hdGNoZXMoZWRpdG9yUmVmc1tpXSwgbmV3SW5wdXQpKSB7DQorCQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsDQorCQkJCQkJTWVzc2FnZXMuQ29tcmVsRGlhZ3JhbUVkaXRvcl9TYXZlQXNFcnJvclRpdGxlLA0KKwkJCQkJCU1lc3NhZ2VzLkNvbXJlbERpYWdyYW1FZGl0b3JfU2F2ZUFzRXJyb3JNZXNzYWdlKTsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCX0NCisJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQlwcm92aWRlci5hYm91dFRvQ2hhbmdlKG5ld0lucHV0KTsNCisJCQlnZXREb2N1bWVudFByb3ZpZGVyKG5ld0lucHV0KS5zYXZlRG9jdW1lbnQocHJvZ3Jlc3NNb25pdG9yLA0KKwkJCQkJbmV3SW5wdXQsDQorCQkJCQlnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSksIHRydWUpOw0KKwkJCXN1Y2Nlc3MgPSB0cnVlOw0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7DQorCQkJSVN0YXR1cyBzdGF0dXMgPSB4LmdldFN0YXR1cygpOw0KKwkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkgew0KKwkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsDQorCQkJCQkJTWVzc2FnZXMuQ29tcmVsRGlhZ3JhbUVkaXRvcl9TYXZlRXJyb3JUaXRsZSwNCisJCQkJCQlNZXNzYWdlcy5Db21yZWxEaWFncmFtRWRpdG9yX1NhdmVFcnJvck1lc3NhZ2UsDQorCQkJCQkJeC5nZXRTdGF0dXMoKSk7DQorCQkJfQ0KKwkJfSBmaW5hbGx5IHsNCisJCQlwcm92aWRlci5jaGFuZ2VkKG5ld0lucHV0KTsNCisJCQlpZiAoc3VjY2Vzcykgew0KKwkJCQlzZXRJbnB1dChuZXdJbnB1dCk7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7DQorCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKCFzdWNjZXNzKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNob3dJbkNvbnRleHQgZ2V0U2hvd0luQ29udGV4dCgpIHsNCisJCXJldHVybiBuZXcgU2hvd0luQ29udGV4dChnZXRFZGl0b3JJbnB1dCgpLCBnZXROYXZpZ2F0b3JTZWxlY3Rpb24oKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVNlbGVjdGlvbiBnZXROYXZpZ2F0b3JTZWxlY3Rpb24oKSB7DQorCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGlhZ3JhbURvY3VtZW50KCk7DQorCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgew0KKwkJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOw0KKwkJfQ0KKwkJRGlhZ3JhbSBkaWFncmFtID0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpOw0KKwkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW0uZVJlc291cmNlKCkpOw0KKwkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCUNvbXJlbE5hdmlnYXRvckl0ZW0gaXRlbSA9IG5ldyBDb21yZWxOYXZpZ2F0b3JJdGVtKGRpYWdyYW0sIGZpbGUsDQorCQkJCQlmYWxzZSk7DQorCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGl0ZW0pOw0KKwkJfQ0KKwkJcmV0dXJuIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsNCisJCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOw0KKwkJRGlhZ3JhbUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIoDQorCQkJCXRoaXMsIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKSk7DQorCQlnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGV4dE1lbnUocHJvdmlkZXIpOw0KKwkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoQWN0aW9uSWRzLkRJQUdSQU1fRURJVE9SX0NPTlRFWFRfTUVOVSwNCisJCQkJcHJvdmlkZXIsIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKSB7DQorCQlzdXBlci5pbml0aWFsaXplR3JhcGhpY2FsVmlld2VyKCk7DQorCQlnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkuYWRkRHJvcFRhcmdldExpc3RlbmVyKA0KKwkJCQluZXcgRHJvcFRhcmdldExpc3RlbmVyKGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKSwNCisJCQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkpIHsNCisNCisJCQkJCXByb3RlY3RlZCBPYmplY3QgZ2V0SmF2YU9iamVjdChUcmFuc2ZlckRhdGEgZGF0YSkgew0KKwkJCQkJCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkNCisJCQkJCQkJCS5uYXRpdmVUb0phdmEoZGF0YSk7DQorCQkJCQl9DQorDQorCQkJCX0pOw0KKwkJZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLmFkZERyb3BUYXJnZXRMaXN0ZW5lcigNCisJCQkJbmV3IERyb3BUYXJnZXRMaXN0ZW5lcihnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCksDQorCQkJCQkJTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKSB7DQorDQorCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEphdmFPYmplY3QoVHJhbnNmZXJEYXRhIGRhdGEpIHsNCisJCQkJCQlyZXR1cm4gTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLm5hdGl2ZVRvSmF2YShkYXRhKTsNCisJCQkJCX0NCisNCisJCQkJfSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgRHJvcFRhcmdldExpc3RlbmVyIGV4dGVuZHMgRGlhZ3JhbURyb3BUYXJnZXRMaXN0ZW5lciB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIERyb3BUYXJnZXRMaXN0ZW5lcihFZGl0UGFydFZpZXdlciB2aWV3ZXIsIFRyYW5zZmVyIHhmZXIpIHsNCisJCQlzdXBlcih2aWV3ZXIsIHhmZXIpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBMaXN0IGdldE9iamVjdHNCZWluZ0Ryb3BwZWQoKSB7DQorCQkJVHJhbnNmZXJEYXRhIGRhdGEgPSBnZXRDdXJyZW50RXZlbnQoKS5jdXJyZW50RGF0YVR5cGU7DQorCQkJSGFzaFNldDxVUkk+IHVyaXMgPSBuZXcgSGFzaFNldDxVUkk+KCk7DQorDQorCQkJT2JqZWN0IHRyYW5zZmVyZWRPYmplY3QgPSBnZXRKYXZhT2JqZWN0KGRhdGEpOw0KKwkJCWlmICh0cmFuc2ZlcmVkT2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCisJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmFuc2ZlcmVkT2JqZWN0Ow0KKwkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQkJCU9iamVjdCBuZXh0U2VsZWN0ZWRPYmplY3QgPSBpdC5uZXh0KCk7DQorCQkJCQlpZiAobmV4dFNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQ29tcmVsTmF2aWdhdG9ySXRlbSkgew0KKwkJCQkJCVZpZXcgdmlldyA9ICgoQ29tcmVsTmF2aWdhdG9ySXRlbSkgbmV4dFNlbGVjdGVkT2JqZWN0KQ0KKwkJCQkJCQkJLmdldFZpZXcoKTsNCisJCQkJCQluZXh0U2VsZWN0ZWRPYmplY3QgPSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCQkJCX0gZWxzZSBpZiAobmV4dFNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgew0KKwkJCQkJCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gKElBZGFwdGFibGUpIG5leHRTZWxlY3RlZE9iamVjdDsNCisJCQkJCQluZXh0U2VsZWN0ZWRPYmplY3QgPSBhZGFwdGFibGUNCisJCQkJCQkJCS5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOw0KKwkJCQkJfQ0KKw0KKwkJCQkJaWYgKG5leHRTZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsNCisJCQkJCQlFT2JqZWN0IG1vZGVsRWxlbWVudCA9IChFT2JqZWN0KSBuZXh0U2VsZWN0ZWRPYmplY3Q7DQorCQkJCQkJdXJpcy5hZGQoRWNvcmVVdGlsLmdldFVSSShtb2RlbEVsZW1lbnQpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisNCisJCQlBcnJheUxpc3Q8RU9iamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0Pih1cmlzLnNpemUoKSk7DQorCQkJZm9yIChVUkkgbmV4dFVSSSA6IHVyaXMpIHsNCisJCQkJRU9iamVjdCBtb2RlbE9iamVjdCA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpDQorCQkJCQkJLmdldEVPYmplY3QobmV4dFVSSSwgdHJ1ZSk7DQorCQkJCXJlc3VsdC5hZGQobW9kZWxPYmplY3QpOw0KKwkJCX0NCisJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0SmF2YU9iamVjdChUcmFuc2ZlckRhdGEgZGF0YSk7DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3ZmMwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKQEAgLTAsMCArMSwzMTYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsNCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucG9saWNpZXMuQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmV4cHJlc3Npb25zLkNvbXJlbE9DTEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5FbGVtZW50SW5pdGlhbGl6ZXJzOw0KK2ltcG9ydCBjb21yZWwucHJvdmlkZXIuQ29tcmVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0iOyAvLyROT04tTkxTLTEkDQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZlcmVuY2VzSGludCBESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQgPSBuZXcgUHJlZmVyZW5jZXNIaW50KA0KKwkJCUlEKTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4gaW5zdGFuY2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbXJlbERvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzIGxpbmtDb25zdHJhaW50czsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRWxlbWVudEluaXRpYWxpemVycyBpbml0aWFsaXplcnM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbXJlbE9DTEZhY3Rvcnkgb2NsRmFjdG9yeTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luKCkgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQorCQlpbnN0YW5jZSA9IHRoaXM7DQorCQlQcmVmZXJlbmNlc0hpbnQucmVnaXN0ZXJQcmVmZXJlbmNlU3RvcmUoRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULA0KKwkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKSk7DQorCQlhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsNCisJCWFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsNCisJCWxpbmtDb25zdHJhaW50cyA9IG51bGw7DQorCQlpbml0aWFsaXplcnMgPSBudWxsOw0KKwkJb2NsRmFjdG9yeSA9IG51bGw7DQorCQlpbnN0YW5jZSA9IG51bGw7DQorCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7DQorCQlyZXR1cm4gaW5zdGFuY2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJQXJyYXlMaXN0PEFkYXB0ZXJGYWN0b3J5PiBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0PEFkYXB0ZXJGYWN0b3J5PigpOw0KKwkJZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhmYWN0b3JpZXMpOw0KKwkJcmV0dXJuIG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoTGlzdDxBZGFwdGVyRmFjdG9yeT4gZmFjdG9yaWVzKSB7DQorCQlmYWN0b3JpZXMuYWRkKG5ldyBDb21yZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisJCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSB7DQorCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihPYmplY3QgaXRlbSkgew0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQ0KKwkJCQkuYWRhcHQoaXRlbSwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsNCisJCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsNCisJCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKA0KKwkJCQkJbGFiZWxQcm92aWRlci5nZXRJbWFnZShpdGVtKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4NCisJICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLg0KKwkgKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoDQorCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3INCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsNCisJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSUQsIHBhdGgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXNwZWN0cyBpbWFnZXMgcmVzaWRpbmcgaW4gYW55IHBsdWctaW4uIElmIHBhdGggaXMgcmVsYXRpdmUsDQorCSAqIHRoZW4gdGhpcyBidW5kbGUgaXMgbG9va2VkIHVwIGZvciB0aGUgaW1hZ2UsIG90aGVyd2lzZSwgZm9yIGFic29sdXRlIA0KKwkgKiBwYXRoLCBmaXJzdCBzZWdtZW50IGlzIHRha2VuIGFzIGlkIG9mIHBsdWctaW4gd2l0aCBpbWFnZQ0KKwkgKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGltYWdlLCBlaXRoZXIgYWJzb2x1dGUgKHdpdGggcGx1Zy1pbiBpZCBhcyBmaXJzdCBzZWdtZW50KSwgb3IgcmVsYXRpdmUgZm9yIGJ1bmRsZWQgaW1hZ2VzDQorCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3INCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGZpbmRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsNCisJCWZpbmFsIElQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsNCisJCWlmIChwLmlzQWJzb2x1dGUoKSAmJiBwLnNlZ21lbnRDb3VudCgpID4gMSkgew0KKwkJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4ocC5zZWdtZW50KDApLCBwDQorCQkJCQkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsNCisJCX0gZWxzZSB7DQorCQkJcmV0dXJuIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4NCisJICogQ2xpZW50IGRvIG5vdCBuZWVkIHRvIGRpc3Bvc2UgdGhpcyBpbWFnZS4gSW1hZ2VzIHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseS4NCisJICoNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KKwkgKiBAcmV0dXJuIGltYWdlIGluc3RhbmNlDQorCSAqLw0KKwlwdWJsaWMgSW1hZ2UgZ2V0QnVuZGxlZEltYWdlKFN0cmluZyBwYXRoKSB7DQorCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7DQorCQlpZiAoaW1hZ2UgPT0gbnVsbCkgew0KKwkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocGF0aCwgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwYXRoKSk7DQorCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOw0KKwkJfQ0KKwkJcmV0dXJuIGltYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHN0cmluZyBmcm9tIHBsdWctaW4ncyByZXNvdXJjZSBidW5kbGUNCisJICoNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsNCisJCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCAiJSIgKyBrZXkpOyAvLyROT04tTkxTLTEkDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoKSB7DQorCQlpZiAoZG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7DQorCQkJZG9jdW1lbnRQcm92aWRlciA9IG5ldyBDb21yZWxEb2N1bWVudFByb3ZpZGVyKCk7DQorCQl9DQorCQlyZXR1cm4gZG9jdW1lbnRQcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cyBnZXRMaW5rQ29uc3RyYWludHMoKSB7DQorCQlyZXR1cm4gbGlua0NvbnN0cmFpbnRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMaW5rQ29uc3RyYWludHMoDQorCQkJQ29tcmVsQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzIGxjKSB7DQorCQl0aGlzLmxpbmtDb25zdHJhaW50cyA9IGxjOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWxlbWVudEluaXRpYWxpemVycyBnZXRFbGVtZW50SW5pdGlhbGl6ZXJzKCkgew0KKwkJcmV0dXJuIGluaXRpYWxpemVyczsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0RWxlbWVudEluaXRpYWxpemVycyhFbGVtZW50SW5pdGlhbGl6ZXJzIGkpIHsNCisJCXRoaXMuaW5pdGlhbGl6ZXJzID0gaTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbE9DTEZhY3RvcnkgZ2V0Q29tcmVsT0NMRmFjdG9yeSgpIHsNCisJCXJldHVybiBvY2xGYWN0b3J5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDb21yZWxPQ0xGYWN0b3J5KENvbXJlbE9DTEZhY3RvcnkgZikgew0KKwkJdGhpcy5vY2xGYWN0b3J5ID0gZjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yKSB7DQorCQlsb2dFcnJvcihlcnJvciwgbnVsbCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIHRocm93YWJsZSkgew0KKwkJaWYgKGVycm9yID09IG51bGwgJiYgdGhyb3dhYmxlICE9IG51bGwpIHsNCisJCQllcnJvciA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7DQorCQl9DQorCQlnZXRMb2coKS5sb2coDQorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwNCisJCQkJCQlJU3RhdHVzLk9LLCBlcnJvciwgdGhyb3dhYmxlKSk7DQorCQlkZWJ1ZyhlcnJvciwgdGhyb3dhYmxlKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSkgew0KKwkJbG9nSW5mbyhtZXNzYWdlLCBudWxsKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgew0KKwkJaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgew0KKwkJCW1lc3NhZ2UgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOw0KKwkJfQ0KKwkJZ2V0TG9nKCkubG9nKA0KKwkJCQluZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwNCisJCQkJCQlJU3RhdHVzLk9LLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsNCisJCWRlYnVnKG1lc3NhZ2UsIHRocm93YWJsZSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgew0KKwkJaWYgKCFpc0RlYnVnZ2luZygpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgew0KKwkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsNCisJCX0NCisJCWlmICh0aHJvd2FibGUgIT0gbnVsbCkgew0KKwkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEaWFncmFtRWRpdG9yVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDhmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpAQCAtMCwwICsxLDQ5NSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JUHJpbWFyeUVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FTUZDb3JlVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuTWFwcGluZ1Zpc3VhbGl6YXRpb247DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbERpYWdyYW1FZGl0b3JVdGlsIHsNCisNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GSUxFTkFNRSA9ICJjb21wb3NpdGVSZWZhY3RvcmluZyI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIE1hcDw/LCA/PiBnZXRTYXZlT3B0aW9ucygpIHsNCisJCUhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQorCQlzYXZlT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJA0KKwkJc2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwNCisJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOw0KKwkJcmV0dXJuIHNhdmVPcHRpb25zOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkRpYWdyYW0oUmVzb3VyY2UgZGlhZ3JhbSkNCisJCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gew0KKwkJU3RyaW5nIHBhdGggPSBkaWFncmFtLmdldFVSSSgpLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSk7DQorCQlJUmVzb3VyY2Ugd29ya3NwYWNlUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpDQorCQkJCS5maW5kTWVtYmVyKG5ldyBQYXRoKHBhdGgpKTsNCisJCWlmICh3b3Jrc3BhY2VSZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7DQorCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCisJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQorCQkJcmV0dXJuIG51bGwgIT0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoDQorCQkJCQkoSUZpbGUpIHdvcmtzcGFjZVJlc291cmNlKSwgQ29tcmVsRGlhZ3JhbUVkaXRvci5JRCk7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyc2V0KElGaWxlIGZpbGUpIHsNCisJCWlmIChmaWxlID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQl0cnkgew0KKwkJCWZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJA0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlVuYWJsZSB0byBzZXQgY2hhcnNldCBmb3IgZmlsZSAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRmlsZU5hbWUoSVBhdGggY29udGFpbmVyRnVsbFBhdGgsDQorCQkJU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB7DQorCQlpZiAoY29udGFpbmVyRnVsbFBhdGggPT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lckZ1bGxQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgew0KKwkJCWZpbGVOYW1lID0gREVGQVVMVF9GSUxFTkFNRTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOw0KKwkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmICFleHRlbnNpb24uZXF1YWxzKGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIHsNCisJCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsNCisJCX0NCisJCWV4dGVuc2lvbiA9IGZpbGVQYXRoLmdldEZpbGVFeHRlbnNpb24oKTsNCisJCWZpbGVOYW1lID0gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7DQorCQlpbnQgaSA9IDE7DQorCQl3aGlsZSAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMoZmlsZVBhdGgpKSB7DQorCQkJaSsrOw0KKwkJCWZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lICsgaSk7DQorCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7DQorCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBmaWxlUGF0aC5sYXN0U2VnbWVudCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSdW5zIHRoZSB3aXphcmQgaW4gYSBkaWFsb2cuDQorCSAqIA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgcnVuV2l6YXJkKFNoZWxsIHNoZWxsLCBXaXphcmQgd2l6YXJkLCBTdHJpbmcgc2V0dGluZ3NLZXkpIHsNCisJCUlEaWFsb2dTZXR0aW5ncyBwbHVnaW5EaWFsb2dTZXR0aW5ncyA9IENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4NCisJCQkJLmdldEluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsNCisJCUlEaWFsb2dTZXR0aW5ncyB3aXphcmREaWFsb2dTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzDQorCQkJCS5nZXRTZWN0aW9uKHNldHRpbmdzS2V5KTsNCisJCWlmICh3aXphcmREaWFsb2dTZXR0aW5ncyA9PSBudWxsKSB7DQorCQkJd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncw0KKwkJCQkJLmFkZE5ld1NlY3Rpb24oc2V0dGluZ3NLZXkpOw0KKwkJfQ0KKwkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZERpYWxvZ1NldHRpbmdzKTsNCisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOw0KKwkJZGlhbG9nLmNyZWF0ZSgpOw0KKwkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heCg1MDAsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwNCisJCQkJNTAwKTsNCisJCWRpYWxvZy5vcGVuKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgDQorCSAqIGNyZWF0ZXMgcmVzb3VyY2VzLg0KKwkgKiANCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlRGlhZ3JhbShVUkkgZGlhZ3JhbVVSSSwgVVJJIG1vZGVsVVJJLA0KKwkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQorCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsNCisJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soDQorCQkJCU1lc3NhZ2VzLkNvbXJlbERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2ssIDMpOw0KKwkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpDQorCQkJCS5jcmVhdGVSZXNvdXJjZShkaWFncmFtVVJJKTsNCisJCWZpbmFsIFJlc291cmNlIG1vZGVsUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkNCisJCQkJLmNyZWF0ZVJlc291cmNlKG1vZGVsVVJJKTsNCisJCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW1VUkkubGFzdFNlZ21lbnQoKTsNCisJCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQllZGl0aW5nRG9tYWluLA0KKwkJCQlNZXNzYWdlcy5Db21yZWxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsLA0KKwkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKSB7DQorCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgNCisJCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQkJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIG1vZGVsID0gY3JlYXRlSW5pdGlhbE1vZGVsKCk7DQorCQkJCWF0dGFjaE1vZGVsVG9SZXNvdXJjZShtb2RlbCwgbW9kZWxSZXNvdXJjZSk7DQorDQorCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsDQorCQkJCQkJQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRCwNCisJCQkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7DQorCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsNCisJCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsNCisJCQkJCWRpYWdyYW0uc2V0TmFtZShkaWFncmFtTmFtZSk7DQorCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOw0KKwkJCQl9DQorDQorCQkJCXRyeSB7DQorCQkJCQltb2RlbFJlc291cmNlDQorCQkJCQkJCS5zYXZlKGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwNCisJCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7DQorCQkJCQlkaWFncmFtUmVzb3VyY2UNCisJCQkJCQkJLnNhdmUoY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yVXRpbA0KKwkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsNCisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKw0KKwkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJCQkiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIsIGUpOyAvLyROT04tTkxTLTEkDQorCQkJCX0NCisJCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7DQorCQkJfQ0KKwkJfTsNCisJCXRyeSB7DQorCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwNCisJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7DQorCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQNCisJCX0NCisJCXNldENoYXJzZXQoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobW9kZWxSZXNvdXJjZSkpOw0KKwkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsNCisJCXJldHVybiBkaWFncmFtUmVzb3VyY2U7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQNCisJICogY3JlYXRlcyByZXNvdXJjZXMuDQorCSAqIA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVEaWFncmFtKFVSSSBkaWFncmFtVVJJLCBVUkkgbW9kZWxVUkksDQorCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIGZpbmFsIFN0cmluZyBjdXN0b21EaWFncmFtTmFtZSwNCisJCQlmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBmaW5hbCBTdHJpbmcgY29ubmVjdGlvblZpc3VhbGl6YXRpb24pIHsNCisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQ0KKwkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOw0KKwkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygNCisJCQkJTWVzc2FnZXMuQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzaywgMyk7DQorCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkNCisJCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOw0KKwkJZmluYWwgUmVzb3VyY2UgbW9kZWxSZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQ0KKwkJCQkuY3JlYXRlUmVzb3VyY2UobW9kZWxVUkkpOw0KKwkJZmluYWwgU3RyaW5nIGRpYWdyYW1OYW1lID0gZGlhZ3JhbVVSSS5sYXN0U2VnbWVudCgpOw0KKwkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWVkaXRpbmdEb21haW4sDQorCQkJCU1lc3NhZ2VzLkNvbXJlbERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsDQorCQkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QpIHsNCisJCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KA0KKwkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pDQorCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCQkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgbW9kZWwgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsNCisJCQkJYXR0YWNoTW9kZWxUb1Jlc291cmNlKG1vZGVsLCBtb2RlbFJlc291cmNlKTsNCisJCQkJaWYgKGN1c3RvbURpYWdyYW1OYW1lID09IG51bGwpIHsNCisJCQkJCW1vZGVsLnNldE5hbWUoIiIpOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJbW9kZWwuc2V0TmFtZShjdXN0b21EaWFncmFtTmFtZS50cmltKCkpOw0KKwkJCQl9DQorCQkJCW1vZGVsLnNldE5hbWVzcGFjZVVyaShuYW1lc3BhY2VVUkkpOw0KKwkJCQltb2RlbC5zZXRNYXBwaW5nVmlzdWFsaXphdGlvbihNYXBwaW5nVmlzdWFsaXphdGlvbg0KKwkJCQkJCS5nZXQoY29ubmVjdGlvblZpc3VhbGl6YXRpb24pKTsNCisJCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwNCisJCQkJCQlDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lELA0KKwkJCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsNCisJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgew0KKwkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOw0KKwkJCQkJZGlhZ3JhbS5zZXROYW1lKGRpYWdyYW1OYW1lKTsNCisJCQkJCWRpYWdyYW0uc2V0RWxlbWVudChtb2RlbCk7DQorCQkJCX0NCisNCisJCQkJdHJ5IHsNCisJCQkJCW1vZGVsUmVzb3VyY2UNCisJCQkJCQkJLnNhdmUoY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yVXRpbA0KKwkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsNCisJCQkJCWRpYWdyYW1SZXNvdXJjZQ0KKwkJCQkJCQkuc2F2ZShjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JVdGlsDQorCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOw0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQorDQorCQkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkJCSJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJfQ0KKwkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsNCisJCQl9DQorCQl9Ow0KKwkJdHJ5IHsNCisJCQlPcGVyYXRpb25IaXN0b3J5RmFjdG9yeS5nZXRPcGVyYXRpb25IaXN0b3J5KCkuZXhlY3V0ZShjb21tYW5kLA0KKwkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsNCisJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShtb2RlbFJlc291cmNlKSk7DQorCQlzZXRDaGFyc2V0KFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSkpOw0KKwkJcmV0dXJuIGRpYWdyYW1SZXNvdXJjZTsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBDb21wb3NpdGVSZWZhY3RvcmluZyBjcmVhdGVJbml0aWFsTW9kZWwoKSB7DQorCQlyZXR1cm4gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmcoKTsNCisJfQ0KKw0KKwkvKioNCisJICogU3RvcmUgbW9kZWwgZWxlbWVudCBpbiB0aGUgcmVzb3VyY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZShDb21wb3NpdGVSZWZhY3RvcmluZyBtb2RlbCwNCisJCQlSZXNvdXJjZSByZXNvdXJjZSkgew0KKwkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0RWxlbWVudHNJbkRpYWdyYW0oDQorCQkJSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGRpYWdyYW1QYXJ0LCBMaXN0PEVkaXRQYXJ0PiBlZGl0UGFydHMpIHsNCisJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5kZXNlbGVjdEFsbCgpOw0KKw0KKwkJRWRpdFBhcnQgZmlyc3RQcmltYXJ5ID0gbnVsbDsNCisJCWZvciAoRWRpdFBhcnQgbmV4dFBhcnQgOiBlZGl0UGFydHMpIHsNCisJCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkuYXBwZW5kU2VsZWN0aW9uKG5leHRQYXJ0KTsNCisJCQlpZiAoZmlyc3RQcmltYXJ5ID09IG51bGwgJiYgbmV4dFBhcnQgaW5zdGFuY2VvZiBJUHJpbWFyeUVkaXRQYXJ0KSB7DQorCQkJCWZpcnN0UHJpbWFyeSA9IG5leHRQYXJ0Ow0KKwkJCX0NCisJCX0NCisNCisJCWlmICghZWRpdFBhcnRzLmlzRW1wdHkoKSkgew0KKwkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5yZXZlYWwoDQorCQkJCQlmaXJzdFByaW1hcnkgIT0gbnVsbCA/IGZpcnN0UHJpbWFyeSA6IChFZGl0UGFydCkgZWRpdFBhcnRzDQorCQkJCQkJCS5nZXQoMCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbVBhcnQsDQorCQkJRU9iamVjdCBlbGVtZW50LCBMaXN0PEVkaXRQYXJ0PiBlZGl0UGFydENvbGxlY3Rvcikgew0KKwkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKSBkaWFncmFtUGFydA0KKwkJCQkuZ2V0Vmlld2VyKCk7DQorCQlmaW5hbCBpbnQgaW50aWFsTnVtT2ZFZGl0UGFydHMgPSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCk7DQorDQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsgLy8gc3VwcG9ydCBub3RhdGlvbiBlbGVtZW50IGxvb2t1cA0KKwkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSB2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgNCisJCQkJCWVsZW1lbnQpOw0KKwkJCWlmIChlZGl0UGFydCAhPSBudWxsKSB7DQorCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChlZGl0UGFydCk7DQorCQkJCXJldHVybiAxOw0KKwkJCX0NCisJCX0NCisNCisJCVN0cmluZyBlbGVtZW50SUQgPSBFTUZDb3JlVXRpbC5nZXRQcm94eUlEKGVsZW1lbnQpOw0KKwkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCQlMaXN0PEVkaXRQYXJ0PiBhc3NvY2lhdGVkUGFydHMgPSB2aWV3ZXIuZmluZEVkaXRQYXJ0c0ZvckVsZW1lbnQoDQorCQkJCWVsZW1lbnRJRCwgSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsNCisJCS8vIHBlcmZvcm0gdGhlIHBvc3NpYmxlIGhpZXJhcmNoeSBkaXNqb2ludCAtPiB0YWtlIHRoZSB0b3AtbW9zdCBwYXJ0cyBvbmx5DQorCQlmb3IgKEVkaXRQYXJ0IG5leHRQYXJ0IDogYXNzb2NpYXRlZFBhcnRzKSB7DQorCQkJRWRpdFBhcnQgcGFyZW50UGFydCA9IG5leHRQYXJ0LmdldFBhcmVudCgpOw0KKwkJCXdoaWxlIChwYXJlbnRQYXJ0ICE9IG51bGwgJiYgIWFzc29jaWF0ZWRQYXJ0cy5jb250YWlucyhwYXJlbnRQYXJ0KSkgew0KKwkJCQlwYXJlbnRQYXJ0ID0gcGFyZW50UGFydC5nZXRQYXJlbnQoKTsNCisJCQl9DQorCQkJaWYgKHBhcmVudFBhcnQgPT0gbnVsbCkgew0KKwkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQobmV4dFBhcnQpOw0KKwkJCX0NCisJCX0NCisNCisJCWlmIChpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9PSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkpIHsNCisJCQlpZiAoIWFzc29jaWF0ZWRQYXJ0cy5pc0VtcHR5KCkpIHsNCisJCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGFzc29jaWF0ZWRQYXJ0cy5nZXQoMCkpOw0KKwkJCX0gZWxzZSB7DQorCQkJCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJCQlyZXR1cm4gZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtUGFydCwNCisJCQkJCQkJZWxlbWVudC5lQ29udGFpbmVyKCksIGVkaXRQYXJ0Q29sbGVjdG9yKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCXJldHVybiBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkgLSBpbnRpYWxOdW1PZkVkaXRQYXJ0czsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBWaWV3IGZpbmRWaWV3KERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQsDQorCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50LCBMYXp5RWxlbWVudDJWaWV3TWFwIGxhenlFbGVtZW50MlZpZXdNYXApIHsNCisJCWJvb2xlYW4gaGFzU3RydWN0dXJhbFVSSSA9IGZhbHNlOw0KKwkJaWYgKHRhcmdldEVsZW1lbnQuZVJlc291cmNlKCkgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgew0KKwkJCWhhc1N0cnVjdHVyYWxVUkkgPSAoKFhNTFJlc291cmNlKSB0YXJnZXRFbGVtZW50LmVSZXNvdXJjZSgpKQ0KKwkJCQkJLmdldElEKHRhcmdldEVsZW1lbnQpID09IG51bGw7DQorCQl9DQorDQorCQlWaWV3IHZpZXcgPSBudWxsOw0KKwkJTGlua2VkTGlzdDxFZGl0UGFydD4gZWRpdFBhcnRIb2xkZXIgPSBuZXcgTGlua2VkTGlzdDxFZGl0UGFydD4oKTsNCisJCWlmIChoYXNTdHJ1Y3R1cmFsVVJJDQorCQkJCSYmICFsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmlzRW1wdHkoKSkgew0KKwkJCXZpZXcgPSBsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmdldCh0YXJnZXRFbGVtZW50KTsNCisJCX0gZWxzZSBpZiAoZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtRWRpdFBhcnQsIHRhcmdldEVsZW1lbnQsDQorCQkJCWVkaXRQYXJ0SG9sZGVyKSA+IDApIHsNCisJCQlFZGl0UGFydCBlZGl0UGFydCA9IGVkaXRQYXJ0SG9sZGVyLmdldCgwKTsNCisJCQl2aWV3ID0gZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcgPyAoVmlldykgZWRpdFBhcnQNCisJCQkJCS5nZXRNb2RlbCgpIDogbnVsbDsNCisJCX0NCisNCisJCXJldHVybiAodmlldyA9PSBudWxsKSA/IGRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpIDogdmlldzsNCisJfQ0KKw0KKwkvKioNCisJICogWFhYIFRoaXMgaXMgcXVpdGUgc3VzcGljaW91cyBjb2RlIChlc3BlY2lhbGx5IGVkaXRQYXJ0VG1wSG9sZGVyKSBhbmQgbGlrZWx5IHRvIGJlIHJlbW92ZWQgc29vbg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIExhenlFbGVtZW50MlZpZXdNYXAgew0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgTWFwPEVPYmplY3QsIFZpZXc+IGVsZW1lbnQyVmlld01hcDsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFZpZXcgc2NvcGU7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBTZXQ8PyBleHRlbmRzIEVPYmplY3Q+IGVsZW1lbnRTZXQ7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIExhenlFbGVtZW50MlZpZXdNYXAoVmlldyBzY29wZSwgU2V0PD8gZXh0ZW5kcyBFT2JqZWN0PiBlbGVtZW50cykgew0KKwkJCXRoaXMuc2NvcGUgPSBzY29wZTsNCisJCQl0aGlzLmVsZW1lbnRTZXQgPSBlbGVtZW50czsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgZmluYWwgTWFwPEVPYmplY3QsIFZpZXc+IGdldEVsZW1lbnQyVmlld01hcCgpIHsNCisJCQlpZiAoZWxlbWVudDJWaWV3TWFwID09IG51bGwpIHsNCisJCQkJZWxlbWVudDJWaWV3TWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgVmlldz4oKTsNCisJCQkJLy8gbWFwIHBvc3NpYmxlIG5vdGF0aW9uIGVsZW1lbnRzIHRvIGl0c2VsZiBhcyB0aGVzZSBjYW4ndCBiZSBmb3VuZCBieSB2aWV3LmdldEVsZW1lbnQoKQ0KKwkJCQlmb3IgKEVPYmplY3QgZWxlbWVudCA6IGVsZW1lbnRTZXQpIHsNCisJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgew0KKwkJCQkJCVZpZXcgdmlldyA9IChWaWV3KSBlbGVtZW50Ow0KKwkJCQkJCWlmICh2aWV3LmdldERpYWdyYW0oKSA9PSBzY29wZS5nZXREaWFncmFtKCkpIHsNCisJCQkJCQkJZWxlbWVudDJWaWV3TWFwLnB1dChlbGVtZW50LCB2aWV3KTsgLy8gdGFrZSBvbmx5IHRob3NlIHRoYXQgcGFydCBvZiBvdXIgZGlhZ3JhbQ0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQlidWlsZEVsZW1lbnQyVmlld01hcChzY29wZSwgZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50U2V0KTsNCisJCQl9DQorCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGJ1aWxkRWxlbWVudDJWaWV3TWFwKFZpZXcgcGFyZW50VmlldywNCisJCQkJTWFwPEVPYmplY3QsIFZpZXc+IGVsZW1lbnQyVmlld01hcCwNCisJCQkJU2V0PD8gZXh0ZW5kcyBFT2JqZWN0PiBlbGVtZW50cykgew0KKwkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorDQorCQkJaWYgKHBhcmVudFZpZXcuaXNTZXRFbGVtZW50KCkNCisJCQkJCSYmICFlbGVtZW50MlZpZXdNYXAuY29udGFpbnNLZXkocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpDQorCQkJCQkmJiBlbGVtZW50cy5jb250YWlucyhwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkpIHsNCisJCQkJZWxlbWVudDJWaWV3TWFwLnB1dChwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSwgcGFyZW50Vmlldyk7DQorCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkgew0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCX0NCisJCQl9DQorCQkJYm9vbGVhbiBjb21wbGV0ZSA9IGZhbHNlOw0KKwkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBwYXJlbnRWaWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCS5oYXNOZXh0KCkgJiYgIWNvbXBsZXRlOykgew0KKwkJCQljb21wbGV0ZSA9IGJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksDQorCQkJCQkJZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50cyk7DQorCQkJfQ0KKwkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCS5oYXNOZXh0KCkgJiYgIWNvbXBsZXRlOykgew0KKwkJCQljb21wbGV0ZSA9IGJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksDQorCQkJCQkJZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50cyk7DQorCQkJfQ0KKwkJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBwYXJlbnRWaWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCS5oYXNOZXh0KCkgJiYgIWNvbXBsZXRlOykgew0KKwkJCQljb21wbGV0ZSA9IGJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksDQorCQkJCQkJZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50cyk7DQorCQkJfQ0KKwkJCXJldHVybiBjb21wbGV0ZTsNCisJCX0NCisJfSAvL0xhenlFbGVtZW50MlZpZXdNYXAJDQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEaWFncmFtVXBkYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbERpYWdyYW1VcGRhdGVDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyZGY1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEaWFncmFtVXBkYXRlQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlckxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxEaWFncmFtVXBkYXRlQ29tbWFuZCBpbXBsZW1lbnRzIElIYW5kbGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZEhhbmRsZXJMaXN0ZW5lcihJSGFuZGxlckxpc3RlbmVyIGhhbmRsZXJMaXN0ZW5lcikgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQorCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkNCisJCQkJLmdldFNlbGVjdGlvbigpOw0KKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7DQorCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOw0KKwkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSAhPSAxKSB7DQorCQkJCXJldHVybiBudWxsOw0KKwkJCX0NCisJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVkaXRQYXJ0DQorCQkJCQkmJiAoKEVkaXRQYXJ0KSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKQ0KKwkJCQkJCQkuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQkJRU9iamVjdCBtb2RlbEVsZW1lbnQgPSAoKFZpZXcpICgoRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24NCisJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsNCisJCQkJTGlzdCBlZGl0UG9saWNpZXMgPSBDYW5vbmljYWxFZGl0UG9saWN5DQorCQkJCQkJLmdldFJlZ2lzdGVyZWRFZGl0UG9saWNpZXMobW9kZWxFbGVtZW50KTsNCisJCQkJZm9yIChJdGVyYXRvciBpdCA9IGVkaXRQb2xpY2llcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorCQkJCQlDYW5vbmljYWxFZGl0UG9saWN5IG5leHRFZGl0UG9saWN5ID0gKENhbm9uaWNhbEVkaXRQb2xpY3kpIGl0DQorCQkJCQkJCS5uZXh0KCk7DQorCQkJCQluZXh0RWRpdFBvbGljeS5yZWZyZXNoKCk7DQorCQkJCX0NCisNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzSGFuZGxlZCgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCByZW1vdmVIYW5kbGVyTGlzdGVuZXIoSUhhbmRsZXJMaXN0ZW5lciBoYW5kbGVyTGlzdGVuZXIpIHsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRGlhZ3JhbVVwZGF0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEaWFncmFtVXBkYXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzExZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRGlhZ3JhbVVwZGF0ZXIuamF2YQpAQCAtMCwwICsxLDg4NTAgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uQ2hlY2s7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdDsNCitpbXBvcnQgY29tcmVsLk11bHRpRmlsdGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlPdXRwdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLk11bHRpU2luZ2xlUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZU91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLio7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxEaWFncmFtVXBkYXRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTaG9ydGN1dE9ycGhhbmVkKFZpZXcgdmlldykgew0KKwkJcmV0dXJuICF2aWV3LmlzU2V0RWxlbWVudCgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpID09IG51bGwNCisJCQkJfHwgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTZW1hbnRpY0NoaWxkcmVuKFZpZXcgdmlldykgew0KKwkJc3dpdGNoIChDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKSB7DQorCQljYXNlIENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ18xMDAwU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8yMDAyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMjAwM1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMjAwNFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8yMDA1U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMjAwNlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMjAwN1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDNTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDdTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzAwOFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzAxMlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzAxNlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwMTlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDIyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzAyNlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzAzMFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzNTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDM0U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMzZTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzN1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzAzOFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwMzlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDQwU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNDFTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDQyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDNTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNDRTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDQ2U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0N1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzA0OVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA1MFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwNTFTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDUyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNTNTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU0U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDU1U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzA1NlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTdTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZpbHRlclVuaXRfMzA1OFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNjBTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNjFTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDYyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzA2M1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDY0U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2NVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDY2U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2N1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNjhTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNjlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNzBTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzA3MVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDcyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDczU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzA3NFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDc1U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzA3N1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNzhTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDAxU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDAyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDNTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDA0U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDA1U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAwNlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDA3U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAwOFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMTBTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAxMVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMTJTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAxM1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAxNFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDE1U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAxNlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzAxN1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAxOFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwMTlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDIwU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjFTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDIyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAyM1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDI0U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAyNVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDI2U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjdTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDI4U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAyOVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDMwU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDMxU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAzMlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMzNTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAzNFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwMzVTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDM2U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwMzdTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzAzOFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDM5U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzA0MFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNDFTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzA0MlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQzU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzA0NFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDQ1U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzA0NlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA0N1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNDhTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA0OVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNTBTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudF83MDUxU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA1MlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDUzU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50XzcwNTRTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA1NVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNTZTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNTdTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDU4U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDU5U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzA2MFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwNjFTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDYyU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwNjNTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzA2NFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwNjVTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDY2U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwNjdTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzA2OFNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA2OVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNzBTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudF83MDcxU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA3MlNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDczU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50XzcwNzRTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc1U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNzZTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA3N1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNzhTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNzlTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDgwU2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA4MVNlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwODJTZW1hbnRpY0NoaWxkcmVuKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRfNzA4M1NlbWFudGljQ2hpbGRyZW4odmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDg0U2VtYW50aWNDaGlsZHJlbih2aWV3KTsNCisJCX0NCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ18xMDAwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIG1vZGVsRWxlbWVudCA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgdmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50DQorCQkJCQkuZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVBhcmFsbGVsUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzIwMDVTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKElucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8yMDA2U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKElucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldEF0b21pY1VuaXRfMjAwN1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlBdG9taWNVbml0IG1vZGVsRWxlbWVudCA9IChBdG9taWNVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDNTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgdmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNpbmdsZUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldE11bHRpSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgdmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNpbmdsZUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldE11bHRpSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIHZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTaW5nbGVJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRNdWx0aUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzAwOFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVGZWF0dXJlVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlRmVhdHVyZVVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCVNpbmdsZU91dHB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE91dHB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwMTJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJTXVsdGlGZWF0dXJlVW5pdCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlGZWF0dXJlVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNlY29uZGFyeUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJTXVsdGlPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwMTZTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlRmlsdGVyVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlRmlsdGVyVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCVNpbmdsZU91dHB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE91dHB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwMTlTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJTXVsdGlGaWx0ZXJVbml0IG1vZGVsRWxlbWVudCA9IChNdWx0aUZpbHRlclVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlNdWx0aU91dHB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE91dHB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwMjJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwMjZTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKElucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8zMDMwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKElucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAzM1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldEF0b21pY1VuaXRfMzAzNFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlBdG9taWNVbml0IG1vZGVsRWxlbWVudCA9IChBdG9taWNVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgdmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNpbmdsZUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldE11bHRpSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMzdTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIHZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTaW5nbGVJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRNdWx0aUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZUZlYXR1cmVVbml0XzMwMzhTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlRmVhdHVyZVVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUZlYXR1cmVVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlTaW5nbGVPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDM5U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCU11bHRpRmVhdHVyZVVuaXQgbW9kZWxFbGVtZW50ID0gKE11bHRpRmVhdHVyZVVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCU11bHRpT3V0cHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDQwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZUZpbHRlclVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUZpbHRlclVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlTaW5nbGVPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldE11bHRpRmlsdGVyVW5pdF8zMDQxU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCU11bHRpRmlsdGVyVW5pdCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlGaWx0ZXJVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJTXVsdGlPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDQyU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZVF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZVF1ZXVlZFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNpbmdsZUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE11bHRpSW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgdmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNpbmdsZUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldE11bHRpSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMzA0NFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDVTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIHZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTaW5nbGVJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRNdWx0aUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8zMDQ2U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKElucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0N1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVBhcmFsbGVsUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSB2aWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwNDlTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQXRvbWljVW5pdCBtb2RlbEVsZW1lbnQgPSAoQXRvbWljVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA1MFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVGZWF0dXJlVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlRmVhdHVyZVVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCVNpbmdsZU91dHB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE91dHB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwNTFTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJTXVsdGlGZWF0dXJlVW5pdCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlGZWF0dXJlVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNlY29uZGFyeUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJTXVsdGlPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlRmlsdGVyVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlRmlsdGVyVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCVNpbmdsZU91dHB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE91dHB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNTNTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJTXVsdGlGaWx0ZXJVbml0IG1vZGVsRWxlbWVudCA9IChNdWx0aUZpbHRlclVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlNdWx0aU91dHB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE91dHB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTRTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2luZ2xlSW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0TXVsdGlJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNTVTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlRmVhdHVyZVVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUZlYXR1cmVVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlTaW5nbGVPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDU2U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCU11bHRpRmVhdHVyZVVuaXQgbW9kZWxFbGVtZW50ID0gKE11bHRpRmVhdHVyZVVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCU11bHRpT3V0cHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDU3U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZUZpbHRlclVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUZpbHRlclVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlTaW5nbGVPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldE11bHRpRmlsdGVyVW5pdF8zMDU4U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCU11bHRpRmlsdGVyVW5pdCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlGaWx0ZXJVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJTXVsdGlPdXRwdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRPdXRwdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU5U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZVF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZVF1ZXVlZFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNpbmdsZUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE11bHRpSW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDYwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNlcXVlbnRpYWxVbml0IG1vZGVsRWxlbWVudCA9IChTZXF1ZW50aWFsVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDYxU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZUZlYXR1cmVVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVGZWF0dXJlVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNlY29uZGFyeUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJU2luZ2xlT3V0cHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldE11bHRpRmVhdHVyZVVuaXRfMzA2MlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlNdWx0aUZlYXR1cmVVbml0IG1vZGVsRWxlbWVudCA9IChNdWx0aUZlYXR1cmVVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXsNCisJCQlNdWx0aU91dHB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE91dHB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZUZpbHRlclVuaXRfMzA2M1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVGaWx0ZXJVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVGaWx0ZXJVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJU2luZ2xlT3V0cHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRNdWx0aUZpbHRlclVuaXRfMzA2NFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlNdWx0aUZpbHRlclVuaXQgbW9kZWxFbGVtZW50ID0gKE11bHRpRmlsdGVyVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlNdWx0aUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCU11bHRpT3V0cHV0UG9ydCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2NVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVRdWV1ZWRVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRTaW5nbGVJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJew0KKwkJCU11bHRpSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRNdWx0aUlucHV0UG9ydCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNjZTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZVF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZVF1ZXVlZFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFNpbmdsZUlucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQl7DQorCQkJTXVsdGlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldE11bHRpSW5wdXRQb3J0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwNjhTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQXRvbWljVW5pdCBtb2RlbEVsZW1lbnQgPSAoQXRvbWljVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMzA2OVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMzA3MFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzFTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMzA3M1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDc0U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUF0b21pY1VuaXQgbW9kZWxFbGVtZW50ID0gKEF0b21pY1VuaXQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldElucHV0UG9ydHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBjaGlsZEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8zMDc1U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmICghdmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKElucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldEF0b21pY1VuaXRfMzA3N1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlBdG9taWNVbml0IG1vZGVsRWxlbWVudCA9IChBdG9taWNVbml0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRJbnB1dFBvcnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgY2hpbGRFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwNzhTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKCF2aWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQXRvbWljVW5pdCBtb2RlbEVsZW1lbnQgPSAoQXRvbWljVW5pdCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SW5wdXRQb3J0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGNoaWxkRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDFTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMDJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMDNTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwMDRTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNhcnRlc2lhblF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDA1U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAwNlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0cygpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDA3U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDA4U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldFJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDA5U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAxMFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAxMVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAxMlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDEzU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDE0U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gKFJlZmFjdG9yaW5nVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDE1U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDE2U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldFJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzAxN1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCUNvbmRpdGlvbkNoZWNrIGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJZigpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMThTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDE5U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRUaGVuKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50XzcwMjBTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldEVsc2UoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAyMVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAyMlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ2FydGVzaWFuUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjNTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVBhcmFsbGVsUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDI0U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXRzKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDI1U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAyNlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0cygpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDI3U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzAyOFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMjlTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVBhcmFsbGVsUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDMwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXRzKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAzMVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzAzMlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IChSZWZhY3RvcmluZ1VuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwMzNTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVBhcmFsbGVsUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDM0U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXRzKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudF83MDM1U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJQ29uZGl0aW9uQ2hlY2sgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldElmKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzAzNlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50XzcwMzdTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldFRoZW4oKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRfNzAzOFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0RWxzZSgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDM5U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDQwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDYXJ0ZXNpYW5RdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChDYXJ0ZXNpYW5RdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldFJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA0MVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNDJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVBhcmFsbGVsUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoUGFyYWxsZWxRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldFJlZmFjdG9yaW5nVW5pdHMoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA0M1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNDRTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZVF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNDVTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZVF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDQ2U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldFJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNDdTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNlcXVlbnRpYWxVbml0IG1vZGVsRWxlbWVudCA9IChTZXF1ZW50aWFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50XzcwNDhTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNlcXVlbnRpYWxVbml0IG1vZGVsRWxlbWVudCA9IChTZXF1ZW50aWFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldFJlZmFjdG9yaW5nVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSAoUmVmYWN0b3JpbmdVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNDlTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZVF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudF83MDUwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldFJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA1MVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCUNvbmRpdGlvbkNoZWNrIGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJZigpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNTJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDUzU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRUaGVuKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50XzcwNTRTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldEVsc2UoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA1NVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50XzcwNTZTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVNpbmdsZVF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZVF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA1N1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzA1OFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IChSZWZhY3RvcmluZ1VuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDU5U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDYwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gKFJlZmFjdG9yaW5nVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA2MVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCUNvbmRpdGlvbkNoZWNrIGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJZigpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwNjJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDYzU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRUaGVuKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50XzcwNjRTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldEVsc2UoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwNjVTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlDb25kaXRpb25DaGVjayBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SWYoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDY2U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRfNzA2N1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0VGhlbigpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDY4U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRFbHNlKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRfNzA2OVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzA3MFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2VxdWVudGlhbFVuaXQgbW9kZWxFbGVtZW50ID0gKFNlcXVlbnRpYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IChSZWZhY3RvcmluZ1VuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50XzcwNzFTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlDb25kaXRpb25DaGVjayBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0SWYoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDcyU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRfNzA3M1NlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0VGhlbigpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudF83MDc0U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRFbHNlKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc1U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlQYXJhbGxlbFF1ZXVlZFVuaXQgbW9kZWxFbGVtZW50ID0gKFBhcmFsbGVsUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ID0gbW9kZWxFbGVtZW50LmdldEhlbHBlclVuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlIZWxwZXJVbml0IGNoaWxkRWxlbWVudCA9IChIZWxwZXJVbml0KSBpdC5uZXh0KCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRfNzA3NlNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJUGFyYWxsZWxRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCVJlZmFjdG9yaW5nVW5pdCBjaGlsZEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQuZ2V0UmVmYWN0b3JpbmdVbml0cygpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc3U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTaW5nbGVRdWV1ZWRVbml0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVRdWV1ZWRVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRfNzA3OFNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJU2luZ2xlUXVldWVkVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlUXVldWVkVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudF83MDc5U2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRIZWxwZXJVbml0cygpLml0ZXJhdG9yKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJSGVscGVyVW5pdCBjaGlsZEVsZW1lbnQgPSAoSGVscGVyVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudF83MDgwU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlTZXF1ZW50aWFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoU2VxdWVudGlhbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IG1vZGVsRWxlbWVudC5nZXRSZWZhY3RvcmluZ1VuaXRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gKFJlZmFjdG9yaW5nVW5pdCkgaXQubmV4dCgpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRfNzA4MVNlbWFudGljQ2hpbGRyZW4oDQorCQkJVmlldyB2aWV3KSB7DQorCQlpZiAoZmFsc2UgPT0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJVmlldyBjb250YWluZXJWaWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJaWYgKCFjb250YWluZXJWaWV3LmlzU2V0RWxlbWVudCgpKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJQ29uZGl0aW9uYWxVbml0IG1vZGVsRWxlbWVudCA9IChDb25kaXRpb25hbFVuaXQpIGNvbnRhaW5lclZpZXcNCisJCQkJLmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPigpOw0KKwkJew0KKwkJCUNvbmRpdGlvbkNoZWNrIGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRJZigpOw0KKwkJCWludCB2aXN1YWxJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKHZpZXcsDQorCQkJCQljaGlsZEVsZW1lbnQpOw0KKwkJCWlmICh2aXN1YWxJRCA9PSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50XzcwODJTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBtb2RlbEVsZW1lbnQuZ2V0SGVscGVyVW5pdHMoKS5pdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUhlbHBlclVuaXQgY2hpbGRFbGVtZW50ID0gKEhlbHBlclVuaXQpIGl0Lm5leHQoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudF83MDgzU2VtYW50aWNDaGlsZHJlbigNCisJCQlWaWV3IHZpZXcpIHsNCisJCWlmIChmYWxzZSA9PSB2aWV3LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlWaWV3IGNvbnRhaW5lclZpZXcgPSAoVmlldykgdmlldy5lQ29udGFpbmVyKCk7DQorCQlpZiAoIWNvbnRhaW5lclZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCQl9DQorCQlDb25kaXRpb25hbFVuaXQgbW9kZWxFbGVtZW50ID0gKENvbmRpdGlvbmFsVW5pdCkgY29udGFpbmVyVmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTm9kZURlc2NyaXB0b3I+KCk7DQorCQl7DQorCQkJUmVmYWN0b3JpbmdVbml0IGNoaWxkRWxlbWVudCA9IG1vZGVsRWxlbWVudC5nZXRUaGVuKCk7DQorCQkJaW50IHZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlldywNCisJCQkJCWNoaWxkRWxlbWVudCk7DQorCQkJaWYgKHZpc3VhbElEID09IENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCXJlc3VsdC5hZGQobmV3IENvbXJlbE5vZGVEZXNjcmlwdG9yKGNoaWxkRWxlbWVudCwgdmlzdWFsSUQpKTsNCisJCQl9DQorCQkJaWYgKHZpc3VhbElEID09IENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50XzcwODRTZW1hbnRpY0NoaWxkcmVuKA0KKwkJCVZpZXcgdmlldykgew0KKwkJaWYgKGZhbHNlID09IHZpZXcuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsNCisJCWlmICghY29udGFpbmVyVmlldy5pc1NldEVsZW1lbnQoKSkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUNvbmRpdGlvbmFsVW5pdCBtb2RlbEVsZW1lbnQgPSAoQ29uZGl0aW9uYWxVbml0KSBjb250YWluZXJWaWV3DQorCQkJCS5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbE5vZGVEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxOb2RlRGVzY3JpcHRvcj4oKTsNCisJCXsNCisJCQlSZWZhY3RvcmluZ1VuaXQgY2hpbGRFbGVtZW50ID0gbW9kZWxFbGVtZW50LmdldEVsc2UoKTsNCisJCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3LA0KKwkJCQkJY2hpbGRFbGVtZW50KTsNCisJCQlpZiAodmlzdWFsSUQgPT0gQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpIHsNCisJCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTm9kZURlc2NyaXB0b3IoY2hpbGRFbGVtZW50LCB2aXN1YWxJRCkpOw0KKwkJCX0NCisJCQlpZiAodmlzdWFsSUQgPT0gQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJCWlmICh2aXN1YWxJRCA9PSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkgew0KKwkJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxOb2RlRGVzY3JpcHRvcihjaGlsZEVsZW1lbnQsIHZpc3VhbElEKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb250YWluZWRMaW5rcyhWaWV3IHZpZXcpIHsNCisJCXN3aXRjaCAoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSkgew0KKwkJY2FzZSBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8yMDAxQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMjAwNENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMjAwNUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8yMDA2Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMjAwN0NvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwMUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAwMkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDAzQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDA1Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAwNkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDA4Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDA5Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxMENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVPdXRwdXRQb3J0XzMwMTFDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDEyQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDEzQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxNENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpT3V0cHV0UG9ydF8zMDE1Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzAxNkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMTdDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZU91dHB1dFBvcnRfMzAxOENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDE5Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAyMENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aU91dHB1dFBvcnRfMzAyMUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDIyQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDIzQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAyNENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI1Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzAyNkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAyN0NvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMjhDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzAzMENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzMUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMzJDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAzM0NvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDM0Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDM1Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM2Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzAzOENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDM5Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNDBDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNDFDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA0MkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M0NvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNDRDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDVDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNDZDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0N0NvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDQ5Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA1MENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDUxQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNTNDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA1NENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNTVDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzA1NkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDU3Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDU4Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTlDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDYwQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA2MUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDYyQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNjNDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2NUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzA2NkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNjhDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDY5Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA3MENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzA3MUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzA3MkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNzNDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzA3NENvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXRfMzA3NUNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uQ2hlY2tfMzA3NkNvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDc3Q29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNzhDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVBvcnRNYXBwaW5nXzQwMDFDb250YWluZWRMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlQb3J0TWFwcGluZ180MDAyQ29udGFpbmVkTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwM0NvbnRhaW5lZExpbmtzKHZpZXcpOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldEluY29taW5nTGlua3MoVmlldyB2aWV3KSB7DQorCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMjAwMUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMkluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzIwMDNJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMjAwNUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzIwMDZJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzIwMDdJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwMUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDAySW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwM0luY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDVJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMDZJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwMDhJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwOUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxMEluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZU91dHB1dFBvcnRfMzAxMUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzAxMkluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDEzSW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDE0SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aU91dHB1dFBvcnRfMzAxNUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzAxNkluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxN0luY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVPdXRwdXRQb3J0XzMwMThJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDE5SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDIwSW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlPdXRwdXRQb3J0XzMwMjFJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDIySW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMjNJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMjRJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI1SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDI2SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMjdJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMjhJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI5SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwMzBJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzMUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAzMkluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzNJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDM0SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMzVJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNkluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzAzOUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNDBJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZpbHRlclVuaXRfMzA0MUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNDJJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M0luY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA0NEluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNDZJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDhJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDQ5SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDUwSW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzA1MUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZpbHRlclVuaXRfMzA1M0luY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTRJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNTVJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDU2SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzA1N0luY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDU4SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA1OUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA2MEluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA2MUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwNjJJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDYzSW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY1SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNjZJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzA2OEluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA2OUluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA3MEluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDcxSW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNzNJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDc0SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzVJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uQ2hlY2tfMzA3NkluY29taW5nTGlua3Modmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNzdJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDc4SW5jb21pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVBvcnRNYXBwaW5nXzQwMDFJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aVBvcnRNYXBwaW5nXzQwMDJJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDNJbmNvbWluZ0xpbmtzKHZpZXcpOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE91dGdvaW5nTGlua3MoVmlldyB2aWV3KSB7DQorCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMjAwMU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMk91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzIwMDNPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMjAwNU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzIwMDZPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzIwMDdPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwMU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDAyT3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwM091dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDVPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMDZPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwMDhPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwOU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxME91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZU91dHB1dFBvcnRfMzAxMU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzAxMk91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydF8zMDEzT3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDE0T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aU91dHB1dFBvcnRfMzAxNU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzAxNk91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxN091dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVPdXRwdXRQb3J0XzMwMThPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDE5T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydF8zMDIwT3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlPdXRwdXRQb3J0XzMwMjFPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDIyT3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMjNPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMjRPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI1T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdF8zMDI2T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMjdPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0XzMwMjhPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI5T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwMzBPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzMU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAzMk91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzNPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDM0T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMzVPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNk91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzAzOU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNDBPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZpbHRlclVuaXRfMzA0MU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNDJPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M091dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA0NE91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNDZPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDhPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDQ5T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDUwT3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXRfMzA1MU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZpbHRlclVuaXRfMzA1M091dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTRPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNTVPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDU2T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXRfMzA1N091dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdF8zMDU4T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA1OU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA2ME91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA2MU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwNjJPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDYzT3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY1T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNjZPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRfMzA2OE91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA2OU91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXRfMzA3ME91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdF8zMDcxT3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0XzMwNzNPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDc0T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzVPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uQ2hlY2tfMzA3Nk91dGdvaW5nTGlua3Modmlldyk7DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0XzMwNzdPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdF8zMDc4T3V0Z29pbmdMaW5rcyh2aWV3KTsNCisJCWNhc2UgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVBvcnRNYXBwaW5nXzQwMDFPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aVBvcnRNYXBwaW5nXzQwMDJPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJY2FzZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDNPdXRnb2luZ0xpbmtzKHZpZXcpOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDBDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIG1vZGVsRWxlbWVudCA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgdmlldw0KKwkJCQkuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldENvbnRhaW5lZFR5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMShtb2RlbEVsZW1lbnQpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0Q29udGFpbmVkVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIobW9kZWxFbGVtZW50KSk7DQorCQlyZXN1bHQuYWRkQWxsKGdldENvbnRhaW5lZFR5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKG1vZGVsRWxlbWVudCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMjAwMUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMkNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8yMDA0Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMjAwNUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8yMDA2Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8yMDA3Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDFDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDAyQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDAzQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMDRDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwNUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpSW5wdXRQb3J0XzMwMDZDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDdDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDA4Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDlDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDEwQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlT3V0cHV0UG9ydF8zMDExQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDEyQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMTNDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDE0Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlPdXRwdXRQb3J0XzMwMTVDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwMTZDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDE3Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlT3V0cHV0UG9ydF8zMDE4Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwMTlDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDIwQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlPdXRwdXRQb3J0XzMwMjFDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwMjJDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAyM0NvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpSW5wdXRQb3J0XzMwMjRDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjVDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDI2Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMjdDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDI4Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI5Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwMzBDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzMUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpSW5wdXRQb3J0XzMwMzJDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzNDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwMzRDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzNUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM2Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMzdDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDM5Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDQwQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNDFDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNDJDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0M0NvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwNDRDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8zMDQ2Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDhDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwNDlDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDUwQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDUxQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDUyQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNTNDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTRDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDU1Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDU2Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDU3Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNThDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTlDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDYwQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA2MUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmVhdHVyZVVuaXRfMzA2MkNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUZpbHRlclVuaXRfMzA2M0NvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmlsdGVyVW5pdF8zMDY0Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY1Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNjZDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNjdDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwNjhDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDY5Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMzA3MENvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8zMDcxQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDczQ29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDc0Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzVDb250YWluZWRMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25DaGVja18zMDc2Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDc3Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDc4Q29udGFpbmVkTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUG9ydE1hcHBpbmdfNDAwMUNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpUG9ydE1hcHBpbmdfNDAwMkNvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwM0NvbnRhaW5lZExpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUlucHV0UG9ydF8yMDAxSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCVNpbmdsZUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nPj4gY3Jvc3NSZWZlcmVuY2VzID0gRWNvcmVVdGlsLkNyb3NzUmVmZXJlbmNlcg0KKwkJCQkuZmluZCh2aWV3LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldEluY29taW5nVHlwZU1vZGVsRmFjZXRMaW5rc19TaW5nbGVQb3J0TWFwcGluZ180MDAxKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDJJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8yMDAzSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzIwMDRJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzIwMDVJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8yMDA2SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzIwMDdJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUlucHV0UG9ydF8zMDAxSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCVNpbmdsZUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nPj4gY3Jvc3NSZWZlcmVuY2VzID0gRWNvcmVVdGlsLkNyb3NzUmVmZXJlbmNlcg0KKwkJCQkuZmluZCh2aWV3LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldEluY29taW5nVHlwZU1vZGVsRmFjZXRMaW5rc19TaW5nbGVQb3J0TWFwcGluZ180MDAxKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDAySW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCU11bHRpSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlQb3J0TWFwcGluZ180MDAyKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDNJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwNUluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMygNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAwNkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+PiBjcm9zc1JlZmVyZW5jZXMgPSBFY29yZVV0aWwuQ3Jvc3NSZWZlcmVuY2VyDQorCQkJCS5maW5kKHZpZXcuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMigNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDA4SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwOUluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMygNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxMEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+PiBjcm9zc1JlZmVyZW5jZXMgPSBFY29yZVV0aWwuQ3Jvc3NSZWZlcmVuY2VyDQorCQkJCS5maW5kKHZpZXcuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMigNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlT3V0cHV0UG9ydF8zMDExSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwMTJJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUlucHV0UG9ydF8zMDEzSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCVNpbmdsZUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nPj4gY3Jvc3NSZWZlcmVuY2VzID0gRWNvcmVVdGlsLkNyb3NzUmVmZXJlbmNlcg0KKwkJCQkuZmluZCh2aWV3LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldEluY29taW5nVHlwZU1vZGVsRmFjZXRMaW5rc19TaW5nbGVQb3J0TWFwcGluZ180MDAxKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDE0SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCU11bHRpSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlQb3J0TWFwcGluZ180MDAyKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aU91dHB1dFBvcnRfMzAxNUluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDE2SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDE3SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCU11bHRpSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlQb3J0TWFwcGluZ180MDAyKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVPdXRwdXRQb3J0XzMwMThJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmlsdGVyVW5pdF8zMDE5SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDIwSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCU11bHRpSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlQb3J0TWFwcGluZ180MDAyKA0KKwkJCQltb2RlbEVsZW1lbnQsIGNyb3NzUmVmZXJlbmNlcykpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aU91dHB1dFBvcnRfMzAyMUluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDIySW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAyM0luY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMygNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAyNEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+PiBjcm9zc1JlZmVyZW5jZXMgPSBFY29yZVV0aWwuQ3Jvc3NSZWZlcmVuY2VyDQorCQkJCS5maW5kKHZpZXcuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMigNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI1SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDI2SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAyN0luY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMygNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAyOEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+PiBjcm9zc1JlZmVyZW5jZXMgPSBFY29yZVV0aWwuQ3Jvc3NSZWZlcmVuY2VyDQorCQkJCS5maW5kKHZpZXcuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMigNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDI5SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRfMzAzMEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMzFJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJU2luZ2xlSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+PiBjcm9zc1JlZmVyZW5jZXMgPSBFY29yZVV0aWwuQ3Jvc3NSZWZlcmVuY2VyDQorCQkJCS5maW5kKHZpZXcuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDEoDQorCQkJCW1vZGVsRWxlbWVudCwgY3Jvc3NSZWZlcmVuY2VzKSk7DQorCQlyZXN1bHQuYWRkQWxsKGdldEluY29taW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMoDQorCQkJCW1vZGVsRWxlbWVudCwgY3Jvc3NSZWZlcmVuY2VzKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpSW5wdXRQb3J0XzMwMzJJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJTXVsdGlJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nPj4gY3Jvc3NSZWZlcmVuY2VzID0gRWNvcmVVdGlsLkNyb3NzUmVmZXJlbmNlcg0KKwkJCQkuZmluZCh2aWV3LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldEluY29taW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIoDQorCQkJCW1vZGVsRWxlbWVudCwgY3Jvc3NSZWZlcmVuY2VzKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAzM0luY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDM0SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzNUluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4+IGNyb3NzUmVmZXJlbmNlcyA9IEVjb3JlVXRpbC5Dcm9zc1JlZmVyZW5jZXINCisJCQkJLmZpbmQodmlldy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0SW5jb21pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMygNCisJCQkJbW9kZWxFbGVtZW50LCBjcm9zc1JlZmVyZW5jZXMpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwMzZJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDM4SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwMzlJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUZpbHRlclVuaXRfMzA0MEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNDFJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA0MkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDNJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwNDRJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRfMzA0NkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDQ5SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDUwSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwNTFJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUZpbHRlclVuaXRfMzA1MkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNTNJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA1NEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA1NUluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDU2SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTdJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmlsdGVyVW5pdF8zMDU4SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTlJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwNjBJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNjFJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmVhdHVyZVVuaXRfMzA2MkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDYzSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUZpbHRlclVuaXRfMzA2NEluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY1SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRfMzA2NkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDY3SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwNjhJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwNjlJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwNzBJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbmRpdGlvbmFsVW5pdF8zMDcxSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRfMzA3MkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMzA3M0luY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDc0SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRfMzA3NUluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uQ2hlY2tfMzA3NkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDc3SW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRBdG9taWNVbml0XzMwNzhJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZVBvcnRNYXBwaW5nXzQwMDFJbmNvbWluZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpUG9ydE1hcHBpbmdfNDAwMkluY29taW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzSW5jb21pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMjAwMU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDEobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMk91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzIwMDNPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRfMjAwNE91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2VxdWVudGlhbFVuaXRfMjAwNU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzIwMDZPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldEF0b21pY1VuaXRfMjAwN091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDFPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJU2luZ2xlSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19TaW5nbGVQb3J0TWFwcGluZ180MDAxKG1vZGVsRWxlbWVudCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDAyT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCU11bHRpSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMihtb2RlbEVsZW1lbnQpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyhtb2RlbEVsZW1lbnQpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDAzT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNE91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMDVPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJU2luZ2xlSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19TaW5nbGVQb3J0TWFwcGluZ180MDAxKG1vZGVsRWxlbWVudCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDA2T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCU11bHRpSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMihtb2RlbEVsZW1lbnQpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyhtb2RlbEVsZW1lbnQpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF8zMDA3T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDA4T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAwOU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDEobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpSW5wdXRQb3J0XzMwMTBPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJTXVsdGlJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlQb3J0TWFwcGluZ180MDAyKG1vZGVsRWxlbWVudCkpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKG1vZGVsRWxlbWVudCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVPdXRwdXRQb3J0XzMwMTFPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJU2luZ2xlT3V0cHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlT3V0cHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDEobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmVhdHVyZVVuaXRfMzAxMk91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlSW5wdXRQb3J0XzMwMTNPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJU2luZ2xlSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19TaW5nbGVQb3J0TWFwcGluZ180MDAxKG1vZGVsRWxlbWVudCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUlucHV0UG9ydF8zMDE0T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCU11bHRpSW5wdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMihtb2RlbEVsZW1lbnQpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyhtb2RlbEVsZW1lbnQpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlPdXRwdXRQb3J0XzMwMTVPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJTXVsdGlPdXRwdXRQb3J0IG1vZGVsRWxlbWVudCA9IChNdWx0aU91dHB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIobW9kZWxFbGVtZW50KSk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUZpbHRlclVuaXRfMzAxNk91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAxN091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIobW9kZWxFbGVtZW50KSk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZU91dHB1dFBvcnRfMzAxOE91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVPdXRwdXRQb3J0IG1vZGVsRWxlbWVudCA9IChTaW5nbGVPdXRwdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMShtb2RlbEVsZW1lbnQpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwMTlPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpSW5wdXRQb3J0XzMwMjBPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJTXVsdGlJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlQb3J0TWFwcGluZ180MDAyKG1vZGVsRWxlbWVudCkpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKG1vZGVsRWxlbWVudCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aU91dHB1dFBvcnRfMzAyMU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aU91dHB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKE11bHRpT3V0cHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpUG9ydE1hcHBpbmdfNDAwMihtb2RlbEVsZW1lbnQpKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMyhtb2RlbEVsZW1lbnQpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDIyT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAyM091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDEobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpSW5wdXRQb3J0XzMwMjRPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJTXVsdGlJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKE11bHRpSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlQb3J0TWFwcGluZ180MDAyKG1vZGVsRWxlbWVudCkpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKG1vZGVsRWxlbWVudCkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjVPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwMjZPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUlucHV0UG9ydF8zMDI3T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCVNpbmdsZUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMShtb2RlbEVsZW1lbnQpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAyOE91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIobW9kZWxFbGVtZW50KSk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwMzBPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUlucHV0UG9ydF8zMDMxT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCVNpbmdsZUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoU2luZ2xlSW5wdXRQb3J0KSB2aWV3LmdldEVsZW1lbnQoKTsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJcmVzdWx0LmFkZEFsbChnZXRPdXRnb2luZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMShtb2RlbEVsZW1lbnQpKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlJbnB1dFBvcnRfMzAzMk91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlNdWx0aUlucHV0UG9ydCBtb2RlbEVsZW1lbnQgPSAoTXVsdGlJbnB1dFBvcnQpIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIobW9kZWxFbGVtZW50KSk7DQorCQlyZXN1bHQuYWRkQWxsKGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzAzM091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDM0T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVJbnB1dFBvcnRfMzAzNU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgbW9kZWxFbGVtZW50ID0gKFNpbmdsZUlucHV0UG9ydCkgdmlldy5nZXRFbGVtZW50KCk7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCXJlc3VsdC5hZGRBbGwoZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDEobW9kZWxFbGVtZW50KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDM2T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzN091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzAzOE91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDM5T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNDBPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmlsdGVyVW5pdF8zMDQxT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNDJPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFBhcmFsbGVsUXVldWVkVW5pdF8zMDQzT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDQ0T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNDZPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0N091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0XzMwNDhPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldEF0b21pY1VuaXRfMzA0OU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmVhdHVyZVVuaXRfMzA1ME91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGZWF0dXJlVW5pdF8zMDUxT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGaWx0ZXJVbml0XzMwNTJPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmlsdGVyVW5pdF8zMDUzT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVRdWV1ZWRVbml0XzMwNTRPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUZlYXR1cmVVbml0XzMwNTVPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpRmVhdHVyZVVuaXRfMzA1Nk91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlRmlsdGVyVW5pdF8zMDU3T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUZpbHRlclVuaXRfMzA1OE91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0U2luZ2xlUXVldWVkVW5pdF8zMDU5T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDYwT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVGZWF0dXJlVW5pdF8zMDYxT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aUZlYXR1cmVVbml0XzMwNjJPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZUZpbHRlclVuaXRfMzA2M091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0TXVsdGlGaWx0ZXJVbml0XzMwNjRPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2NU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNjZPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNpbmdsZVF1ZXVlZFVuaXRfMzA2N091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDY4T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDY5T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTZXF1ZW50aWFsVW5pdF8zMDcwT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb25kaXRpb25hbFVuaXRfMzA3MU91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzJPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldFNlcXVlbnRpYWxVbml0XzMwNzNPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldEF0b21pY1VuaXRfMzA3NE91dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29uZGl0aW9uYWxVbml0XzMwNzVPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbmRpdGlvbkNoZWNrXzMwNzZPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldEF0b21pY1VuaXRfMzA3N091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0QXRvbWljVW5pdF8zMDc4T3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRTaW5nbGVQb3J0TWFwcGluZ180MDAxT3V0Z29pbmdMaW5rcygNCisJCQlWaWV3IHZpZXcpIHsNCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRNdWx0aVBvcnRNYXBwaW5nXzQwMDJPdXRnb2luZ0xpbmtzKA0KKwkJCVZpZXcgdmlldykgew0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwM091dGdvaW5nTGlua3MoDQorCQkJVmlldyB2aWV3KSB7DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldENvbnRhaW5lZFR5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIpIHsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBsaW5rcyA9IGNvbnRhaW5lci5nZXRQb3J0TWFwcGluZ3MoKS5pdGVyYXRvcigpOyBsaW5rcw0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUVPYmplY3QgbGlua09iamVjdCA9IChFT2JqZWN0KSBsaW5rcy5uZXh0KCk7DQorCQkJaWYgKGZhbHNlID09IGxpbmtPYmplY3QgaW5zdGFuY2VvZiBTaW5nbGVQb3J0TWFwcGluZykgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJU2luZ2xlUG9ydE1hcHBpbmcgbGluayA9IChTaW5nbGVQb3J0TWFwcGluZykgbGlua09iamVjdDsNCisJCQlpZiAoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQgIT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChsaW5rKSkgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJU2luZ2xlSW5wdXRQb3J0IGRzdCA9IGxpbmsuZ2V0VGFyZ2V0KCk7DQorCQkJU2luZ2xlUG9ydCBzcmMgPSBsaW5rLmdldFNvdXJjZSgpOw0KKwkJCXJlc3VsdC5hZGQobmV3IENvbXJlbExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LCBsaW5rLA0KKwkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEsDQorCQkJCQlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0Q29udGFpbmVkVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIoDQorCQkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyKSB7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCWZvciAoSXRlcmF0b3I8Pz4gbGlua3MgPSBjb250YWluZXIuZ2V0UG9ydE1hcHBpbmdzKCkuaXRlcmF0b3IoKTsgbGlua3MNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlFT2JqZWN0IGxpbmtPYmplY3QgPSAoRU9iamVjdCkgbGlua3MubmV4dCgpOw0KKwkJCWlmIChmYWxzZSA9PSBsaW5rT2JqZWN0IGluc3RhbmNlb2YgTXVsdGlQb3J0TWFwcGluZykgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJTXVsdGlQb3J0TWFwcGluZyBsaW5rID0gKE11bHRpUG9ydE1hcHBpbmcpIGxpbmtPYmplY3Q7DQorCQkJaWYgKE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQgIT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChsaW5rKSkgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJTXVsdGlJbnB1dFBvcnQgZHN0ID0gbGluay5nZXRUYXJnZXQoKTsNCisJCQlNdWx0aVBvcnQgc3JjID0gbGluay5nZXRTb3VyY2UoKTsNCisJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwgbGluaywNCisJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIsDQorCQkJCQlNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRDb250YWluZWRUeXBlTW9kZWxGYWNldExpbmtzX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMygNCisJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb250YWluZXIpIHsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBsaW5rcyA9IGNvbnRhaW5lci5nZXRQb3J0TWFwcGluZ3MoKS5pdGVyYXRvcigpOyBsaW5rcw0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUVPYmplY3QgbGlua09iamVjdCA9IChFT2JqZWN0KSBsaW5rcy5uZXh0KCk7DQorCQkJaWYgKGZhbHNlID09IGxpbmtPYmplY3QgaW5zdGFuY2VvZiBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKSB7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIGxpbmsgPSAoTXVsdGlTaW5nbGVQb3J0TWFwcGluZykgbGlua09iamVjdDsNCisJCQlpZiAoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCAhPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKGxpbmspKSB7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlTaW5nbGVJbnB1dFBvcnQgZHN0ID0gbGluay5nZXRUYXJnZXQoKTsNCisJCQlNdWx0aVBvcnQgc3JjID0gbGluay5nZXRTb3VyY2UoKTsNCisJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwgbGluaywNCisJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMsDQorCQkJCQlNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQlTaW5nbGVJbnB1dFBvcnQgdGFyZ2V0LA0KKwkJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nPj4gY3Jvc3NSZWZlcmVuY2VzKSB7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+IHNldHRpbmdzID0gY3Jvc3NSZWZlcmVuY2VzDQorCQkJCS5nZXQodGFyZ2V0KTsNCisJCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcgc2V0dGluZyA6IHNldHRpbmdzKSB7DQorCQkJaWYgKHNldHRpbmcuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkgIT0gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRTaW5nbGVQb3J0TWFwcGluZ19UYXJnZXQoKQ0KKwkJCQkJfHwgZmFsc2UgPT0gc2V0dGluZy5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBTaW5nbGVQb3J0TWFwcGluZykgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJU2luZ2xlUG9ydE1hcHBpbmcgbGluayA9IChTaW5nbGVQb3J0TWFwcGluZykgc2V0dGluZy5nZXRFT2JqZWN0KCk7DQorCQkJaWYgKFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEICE9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQobGluaykpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCVNpbmdsZVBvcnQgc3JjID0gbGluay5nZXRTb3VyY2UoKTsNCisJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxMaW5rRGVzY3JpcHRvcihzcmMsIHRhcmdldCwgbGluaywNCisJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxLA0KKwkJCQkJU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldEluY29taW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIoDQorCQkJTXVsdGlJbnB1dFBvcnQgdGFyZ2V0LA0KKwkJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nPj4gY3Jvc3NSZWZlcmVuY2VzKSB7DQorCQlMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4oKTsNCisJCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+IHNldHRpbmdzID0gY3Jvc3NSZWZlcmVuY2VzDQorCQkJCS5nZXQodGFyZ2V0KTsNCisJCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcgc2V0dGluZyA6IHNldHRpbmdzKSB7DQorCQkJaWYgKHNldHRpbmcuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkgIT0gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UNCisJCQkJCS5nZXRNdWx0aVBvcnRNYXBwaW5nX1RhcmdldCgpDQorCQkJCQl8fCBmYWxzZSA9PSBzZXR0aW5nLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIE11bHRpUG9ydE1hcHBpbmcpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCU11bHRpUG9ydE1hcHBpbmcgbGluayA9IChNdWx0aVBvcnRNYXBwaW5nKSBzZXR0aW5nLmdldEVPYmplY3QoKTsNCisJCQlpZiAoTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCAhPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKGxpbmspKSB7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlNdWx0aVBvcnQgc3JjID0gbGluay5nZXRTb3VyY2UoKTsNCisJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxMaW5rRGVzY3JpcHRvcihzcmMsIHRhcmdldCwgbGluaywNCisJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVBvcnRNYXBwaW5nXzQwMDIsDQorCQkJCQlNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPENvbXJlbExpbmtEZXNjcmlwdG9yPiBnZXRJbmNvbWluZ1R5cGVNb2RlbEZhY2V0TGlua3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKA0KKwkJCVNpbmdsZUlucHV0UG9ydCB0YXJnZXQsDQorCQkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+PiBjcm9zc1JlZmVyZW5jZXMpIHsNCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4gc2V0dGluZ3MgPSBjcm9zc1JlZmVyZW5jZXMNCisJCQkJLmdldCh0YXJnZXQpOw0KKwkJZm9yIChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZyBzZXR0aW5nIDogc2V0dGluZ3MpIHsNCisJCQlpZiAoc2V0dGluZy5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSAhPSBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRQ0KKwkJCQkJLmdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfVGFyZ2V0KCkNCisJCQkJCXx8IGZhbHNlID09IHNldHRpbmcuZ2V0RU9iamVjdCgpIGluc3RhbmNlb2YgTXVsdGlTaW5nbGVQb3J0TWFwcGluZykgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJTXVsdGlTaW5nbGVQb3J0TWFwcGluZyBsaW5rID0gKE11bHRpU2luZ2xlUG9ydE1hcHBpbmcpIHNldHRpbmcNCisJCQkJCS5nZXRFT2JqZWN0KCk7DQorCQkJaWYgKE11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQgIT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChsaW5rKSkgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJTXVsdGlQb3J0IHNyYyA9IGxpbmsuZ2V0U291cmNlKCk7DQorCQkJcmVzdWx0LmFkZChuZXcgQ29tcmVsTGlua0Rlc2NyaXB0b3Ioc3JjLCB0YXJnZXQsIGxpbmssDQorCQkJCQlDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzLA0KKwkJCQkJTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxDb21yZWxMaW5rRGVzY3JpcHRvcj4gZ2V0T3V0Z29pbmdUeXBlTW9kZWxGYWNldExpbmtzX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDEoDQorCQkJU2luZ2xlUG9ydCBzb3VyY2UpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNvbnRhaW5lciA9IG51bGw7DQorCQkvLyBGaW5kIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgbGluay4NCisJCS8vIENsaW1iIHVwIGJ5IGNvbnRhaW5tZW50IGhpZXJhcmNoeSBzdGFydGluZyBmcm9tIHRoZSBzb3VyY2UNCisJCS8vIGFuZCByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBpbnN0YW5jZSBvZiB0aGUgY29udGFpbmVyIGNsYXNzLg0KKwkJZm9yIChFT2JqZWN0IGVsZW1lbnQgPSBzb3VyY2U7IGVsZW1lbnQgIT0gbnVsbCAmJiBjb250YWluZXIgPT0gbnVsbDsgZWxlbWVudCA9IGVsZW1lbnQNCisJCQkJLmVDb250YWluZXIoKSkgew0KKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlUmVmYWN0b3JpbmcpIHsNCisJCQkJY29udGFpbmVyID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSBlbGVtZW50Ow0KKwkJCX0NCisJCX0NCisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgew0KKwkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisJCX0NCisJCUxpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENvbXJlbExpbmtEZXNjcmlwdG9yPigpOw0KKwkJZm9yIChJdGVyYXRvcjw/PiBsaW5rcyA9IGNvbnRhaW5lci5nZXRQb3J0TWFwcGluZ3MoKS5pdGVyYXRvcigpOyBsaW5rcw0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCUVPYmplY3QgbGlua09iamVjdCA9IChFT2JqZWN0KSBsaW5rcy5uZXh0KCk7DQorCQkJaWYgKGZhbHNlID09IGxpbmtPYmplY3QgaW5zdGFuY2VvZiBTaW5nbGVQb3J0TWFwcGluZykgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJU2luZ2xlUG9ydE1hcHBpbmcgbGluayA9IChTaW5nbGVQb3J0TWFwcGluZykgbGlua09iamVjdDsNCisJCQlpZiAoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQgIT0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChsaW5rKSkgew0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJU2luZ2xlSW5wdXRQb3J0IGRzdCA9IGxpbmsuZ2V0VGFyZ2V0KCk7DQorCQkJU2luZ2xlUG9ydCBzcmMgPSBsaW5rLmdldFNvdXJjZSgpOw0KKwkJCWlmIChzcmMgIT0gc291cmNlKSB7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwgbGluaywNCisJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxLA0KKwkJCQkJU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVBvcnRNYXBwaW5nXzQwMDIoDQorCQkJTXVsdGlQb3J0IHNvdXJjZSkgew0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyID0gbnVsbDsNCisJCS8vIEZpbmQgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBsaW5rLg0KKwkJLy8gQ2xpbWIgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlIHNvdXJjZQ0KKwkJLy8gYW5kIHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mIHRoZSBjb250YWluZXIgY2xhc3MuDQorCQlmb3IgKEVPYmplY3QgZWxlbWVudCA9IHNvdXJjZTsgZWxlbWVudCAhPSBudWxsICYmIGNvbnRhaW5lciA9PSBudWxsOyBlbGVtZW50ID0gZWxlbWVudA0KKwkJCQkuZUNvbnRhaW5lcigpKSB7DQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCQljb250YWluZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGVsZW1lbnQ7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGxpbmtzID0gY29udGFpbmVyLmdldFBvcnRNYXBwaW5ncygpLml0ZXJhdG9yKCk7IGxpbmtzDQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJRU9iamVjdCBsaW5rT2JqZWN0ID0gKEVPYmplY3QpIGxpbmtzLm5leHQoKTsNCisJCQlpZiAoZmFsc2UgPT0gbGlua09iamVjdCBpbnN0YW5jZW9mIE11bHRpUG9ydE1hcHBpbmcpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCU11bHRpUG9ydE1hcHBpbmcgbGluayA9IChNdWx0aVBvcnRNYXBwaW5nKSBsaW5rT2JqZWN0Ow0KKwkJCWlmIChNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEICE9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQobGluaykpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCU11bHRpSW5wdXRQb3J0IGRzdCA9IGxpbmsuZ2V0VGFyZ2V0KCk7DQorCQkJTXVsdGlQb3J0IHNyYyA9IGxpbmsuZ2V0U291cmNlKCk7DQorCQkJaWYgKHNyYyAhPSBzb3VyY2UpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCXJlc3VsdC5hZGQobmV3IENvbXJlbExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LCBsaW5rLA0KKwkJCQkJQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMiwNCisJCQkJCU11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29tcmVsTGlua0Rlc2NyaXB0b3I+IGdldE91dGdvaW5nVHlwZU1vZGVsRmFjZXRMaW5rc19NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMoDQorCQkJTXVsdGlQb3J0IHNvdXJjZSkgew0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29udGFpbmVyID0gbnVsbDsNCisJCS8vIEZpbmQgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBsaW5rLg0KKwkJLy8gQ2xpbWIgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlIHNvdXJjZQ0KKwkJLy8gYW5kIHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mIHRoZSBjb250YWluZXIgY2xhc3MuDQorCQlmb3IgKEVPYmplY3QgZWxlbWVudCA9IHNvdXJjZTsgZWxlbWVudCAhPSBudWxsICYmIGNvbnRhaW5lciA9PSBudWxsOyBlbGVtZW50ID0gZWxlbWVudA0KKwkJCQkuZUNvbnRhaW5lcigpKSB7DQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCQljb250YWluZXIgPSAoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGVsZW1lbnQ7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7DQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKwkJfQ0KKwkJTGlua2VkTGlzdDxDb21yZWxMaW5rRGVzY3JpcHRvcj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8Q29tcmVsTGlua0Rlc2NyaXB0b3I+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPD8+IGxpbmtzID0gY29udGFpbmVyLmdldFBvcnRNYXBwaW5ncygpLml0ZXJhdG9yKCk7IGxpbmtzDQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJRU9iamVjdCBsaW5rT2JqZWN0ID0gKEVPYmplY3QpIGxpbmtzLm5leHQoKTsNCisJCQlpZiAoZmFsc2UgPT0gbGlua09iamVjdCBpbnN0YW5jZW9mIE11bHRpU2luZ2xlUG9ydE1hcHBpbmcpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCU11bHRpU2luZ2xlUG9ydE1hcHBpbmcgbGluayA9IChNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKSBsaW5rT2JqZWN0Ow0KKwkJCWlmIChNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEICE9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQobGluaykpIHsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCVNpbmdsZUlucHV0UG9ydCBkc3QgPSBsaW5rLmdldFRhcmdldCgpOw0KKwkJCU11bHRpUG9ydCBzcmMgPSBsaW5rLmdldFNvdXJjZSgpOw0KKwkJCWlmIChzcmMgIT0gc291cmNlKSB7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlyZXN1bHQuYWRkKG5ldyBDb21yZWxMaW5rRGVzY3JpcHRvcihzcmMsIGRzdCwgbGluaywNCisJCQkJCUNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMsDQorCQkJCQlNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxEb2N1bWVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRG9jdW1lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzM5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRG9jdW1lbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTEzMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uTm90aWZpY2F0aW9uRmlsdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Eb2N1bWVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JTdGF0dXNDb2RlczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLnV0aWwuRGlhZ3JhbUlPVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbERvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cw0KKwkJSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCkNCisJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dA0KKwkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsNCisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigNCisJCQkJCW5ldyBTdGF0dXMoDQorCQkJCQkJCUlTdGF0dXMuRVJST1IsDQorCQkJCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsDQorCQkJCQkJCTAsDQorCQkJCQkJCU5MUy5iaW5kKA0KKwkJCQkJCQkJCU1lc3NhZ2VzLkNvbXJlbERvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwNCisJCQkJCQkJCQluZXcgT2JqZWN0W10gew0KKwkJCQkJCQkJCQkJZWxlbWVudCwNCisJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsICJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIA0KKwkJCQkJCQludWxsKSk7DQorCQl9DQorCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbGVtZW50Ow0KKwkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBjcmVhdGVEb2N1bWVudChlZGl0b3JJbnB1dCk7DQorDQorCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IG5ldyBSZXNvdXJjZVNldEluZm8oZG9jdW1lbnQsIGVkaXRvcklucHV0KTsNCisJCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsNCisJCWluZm8uZlN0YXR1cyA9IG51bGw7DQorCQlyZXR1cm4gaW5mbzsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KKwkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQNCisJCQkJJiYgZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7DQorCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oDQorCQkJCQluZXcgU3RhdHVzKA0KKwkJCQkJCQlJU3RhdHVzLkVSUk9SLA0KKwkJCQkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLklELA0KKwkJCQkJCQkwLA0KKwkJCQkJCQlOTFMuYmluZCgNCisJCQkJCQkJCQlNZXNzYWdlcy5Db21yZWxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsDQorCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsNCisJCQkJCQkJCQkJCWVsZW1lbnQsDQorCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLCAib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dCIgfSksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCANCisJCQkJCQkJbnVsbCkpOw0KKwkJfQ0KKwkJSURvY3VtZW50IGRvY3VtZW50ID0gY3JlYXRlRW1wdHlEb2N1bWVudCgpOw0KKwkJc2V0RG9jdW1lbnRDb250ZW50KGRvY3VtZW50LCAoSUVkaXRvcklucHV0KSBlbGVtZW50KTsNCisJCXNldHVwRG9jdW1lbnQoZWxlbWVudCwgZG9jdW1lbnQpOw0KKwkJcmV0dXJuIGRvY3VtZW50Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBTZXRzIHVwIHRoZSBnaXZlbiBkb2N1bWVudCBhcyBpdCB3b3VsZCBiZSBwcm92aWRlZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoZQ0KKwkgKiBjb250ZW50IG9mIHRoZSBkb2N1bWVudCBpcyBub3QgY2hhbmdlZC4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5Lg0KKwkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4NCisJICogDQorCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBibHVlLXByaW50IGVsZW1lbnQNCisJICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byBzZXQgdXANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2V0dXBEb2N1bWVudChPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50KSB7DQorCQkvLyBmb3Igc3ViY2xhc3Nlcw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7DQorCQlpbnQgcmVzdWx0ID0gMDsNCisJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gaW5mby5nZXRMb2FkZWRSZXNvdXJjZXNJdGVyYXRvcigpOyBpdA0KKwkJCQkuaGFzTmV4dCgpOykgew0KKwkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IGl0Lm5leHQoKTsNCisJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsNCisJCQlpZiAoZmlsZSAhPSBudWxsKSB7DQorCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgew0KKwkJCQkJcmVzdWx0ICs9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCXJlc3VsdCArPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKSB7DQorCQlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRGlhZ3JhbURvY3VtZW50KCk7DQorCQlkb2N1bWVudC5zZXRFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7DQorCQlyZXR1cm4gZG9jdW1lbnQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsNCisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBEaWFncmFtRWRpdGluZ0RvbWFpbkZhY3RvcnkNCisJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOw0KKwkJZWRpdGluZ0RvbWFpbi5zZXRJRCgiY29tcmVsLmRpYWdyYW0uRWRpdGluZ0RvbWFpbiIpOyAvLyROT04tTkxTLTEkDQorCQlmaW5hbCBOb3RpZmljYXRpb25GaWx0ZXIgZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXINCisJCQkJLmNyZWF0ZU5vdGlmaWVyRmlsdGVyKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkNCisJCQkJLmFuZChOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5BREQpKQ0KKwkJCQkuYW5kKE5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVGZWF0dXJlRmlsdGVyKFJlc291cmNlU2V0LmNsYXNzLA0KKwkJCQkJCVJlc291cmNlU2V0LlJFU09VUkNFX1NFVF9fUkVTT1VSQ0VTKSk7DQorCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVyKCkgew0KKw0KKwkJCXByaXZhdGUgTm90aWZpZXIgbXlUYXJnZXI7DQorDQorCQkJcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsNCisJCQkJcmV0dXJuIG15VGFyZ2VyOw0KKwkJCX0NCisNCisJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorDQorCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQkJCWlmIChkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlci5tYXRjaGVzKG5vdGlmaWNhdGlvbikpIHsNCisJCQkJCU9iamVjdCB2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOw0KKwkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsNCisJCQkJCQkoKFJlc291cmNlKSB2YWx1ZSkuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgew0KKwkJCQlteVRhcmdlciA9IG5ld1RhcmdldDsNCisJCQl9DQorDQorCQl9KTsNCisNCisJCXJldHVybiBlZGl0aW5nRG9tYWluOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgZWxlbWVudCkNCisJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQlJRGlhZ3JhbURvY3VtZW50IGRpYWdyYW1Eb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudDsNCisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCk7DQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgew0KKwkJCUlTdG9yYWdlIHN0b3JhZ2UgPSAoKEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpOw0KKwkJCURpYWdyYW0gZGlhZ3JhbSA9IERpYWdyYW1JT1V0aWwubG9hZChkb21haW4sIHN0b3JhZ2UsIHRydWUsDQorCQkJCQlnZXRQcm9ncmVzc01vbml0b3IoKSk7DQorCQkJZG9jdW1lbnQuc2V0Q29udGVudChkaWFncmFtKTsNCisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7DQorCQkJVVJJIHVyaSA9ICgoVVJJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFVSSSgpOw0KKwkJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsNCisJCQl0cnkgew0KKwkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKA0KKwkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSwgZmFsc2UpOw0KKwkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgew0KKwkJCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSgNCisJCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpKTsNCisJCQkJfQ0KKwkJCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgNCisJCQkJCQkJCUdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7DQorCQkJCQkJLy8gQHNlZSAxNzEwNjAgDQorCQkJCQkJLy8gb3B0aW9ucy5wdXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsNCisJCQkJCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOw0KKwkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCQkJCXJlc291cmNlLnVubG9hZCgpOw0KKwkJCQkJCXRocm93IGU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJaWYgKHVyaS5mcmFnbWVudCgpICE9IG51bGwpIHsNCisJCQkJCUVPYmplY3Qgcm9vdEVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaS5mcmFnbWVudCgpKTsNCisJCQkJCWlmIChyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsNCisJCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7DQorCQkJCQkJcmV0dXJuOw0KKwkJCQkJfQ0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCQlPYmplY3Qgcm9vdEVsZW1lbnQgPSBpdC5uZXh0KCk7DQorCQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgew0KKwkJCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7DQorCQkJCQkJCXJldHVybjsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oDQorCQkJCQkJTWVzc2FnZXMuQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3IpOw0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJCUNvcmVFeGNlcHRpb24gdGhyb3duRXhjcCA9IG51bGw7DQorCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgew0KKwkJCQkJdGhyb3duRXhjcCA9IChDb3JlRXhjZXB0aW9uKSBlOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOw0KKwkJCQkJdGhyb3duRXhjcCA9IG5ldyBDb3JlRXhjZXB0aW9uKA0KKwkJCQkJCQluZXcgU3RhdHVzKA0KKwkJCQkJCQkJCUlTdGF0dXMuRVJST1IsDQorCQkJCQkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwNCisJCQkJCQkJCQkwLA0KKwkJCQkJCQkJCW1zZyAhPSBudWxsID8gbXNnDQorCQkJCQkJCQkJCQk6IE1lc3NhZ2VzLkNvbXJlbERvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvciwNCisJCQkJCQkJCQllKSk7DQorCQkJCX0NCisJCQkJdGhyb3cgdGhyb3duRXhjcDsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKA0KKwkJCQkJbmV3IFN0YXR1cygNCisJCQkJCQkJSVN0YXR1cy5FUlJPUiwNCisJCQkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwNCisJCQkJCQkJMCwNCisJCQkJCQkJTkxTLmJpbmQoDQorCQkJCQkJCQkJTWVzc2FnZXMuQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLA0KKwkJCQkJCQkJCW5ldyBPYmplY3RbXSB7DQorCQkJCQkJCQkJCQllbGVtZW50LA0KKwkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwgIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgDQorCQkJCQkJCW51bGwpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsNCisJCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOw0KKwkJaWYgKGluZm8gIT0gbnVsbCkgew0KKwkJCXJldHVybiBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoZWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgew0KKwkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IGdldERpYWdyYW1Eb2N1bWVudChlbGVtZW50KTsNCisJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7DQorCQkJUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpOw0KKwkJCWlmIChkaWFncmFtUmVzb3VyY2UgIT0gbnVsbCkgew0KKwkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKTsNCisJCQkJcmV0dXJuIGZpbGUgPT0gbnVsbCB8fCBmaWxlLmdldExvY2F0aW9uKCkgPT0gbnVsbA0KKwkJCQkJCXx8ICFmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZXhpc3RzKCk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmlzRGVsZXRlZChlbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFJlc291cmNlU2V0SW5mbyBnZXRSZXNvdXJjZVNldEluZm8oT2JqZWN0IGVkaXRvcklucHV0KSB7DQorCQlyZXR1cm4gKFJlc291cmNlU2V0SW5mbykgc3VwZXIuZ2V0RWxlbWVudEluZm8oZWRpdG9ySW5wdXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQsIEVsZW1lbnRJbmZvIGluZm8pIHsNCisJCWlmIChpbmZvIGluc3RhbmNlb2YgUmVzb3VyY2VTZXRJbmZvKSB7DQorCQkJUmVzb3VyY2VTZXRJbmZvIHJlc291cmNlU2V0SW5mbyA9IChSZXNvdXJjZVNldEluZm8pIGluZm87DQorCQkJcmVzb3VyY2VTZXRJbmZvLmRpc3Bvc2UoKTsNCisJCX0NCisJCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZVN0YXRlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgY29tcHV0YXRpb25Db250ZXh0KQ0KKwkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOw0KKwkJaWYgKGluZm8gIT0gbnVsbCkgew0KKwkJCUxpbmtlZExpc3Q8SUZpbGU+IGZpbGVzMlZhbGlkYXRlID0gbmV3IExpbmtlZExpc3Q8SUZpbGU+KCk7DQorCQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSBpbmZvLmdldExvYWRlZFJlc291cmNlc0l0ZXJhdG9yKCk7IGl0DQorCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSBpdC5uZXh0KCk7DQorCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOw0KKwkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7DQorCQkJCQlmaWxlczJWYWxpZGF0ZS5hZGQoZmlsZSk7DQorCQkJCX0NCisJCQl9DQorCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdCgNCisJCQkJCShJRmlsZVtdKSBmaWxlczJWYWxpZGF0ZS50b0FycmF5KG5ldyBJRmlsZVtmaWxlczJWYWxpZGF0ZQ0KKwkJCQkJCQkuc2l6ZSgpXSksIGNvbXB1dGF0aW9uQ29udGV4dCk7DQorCQl9DQorDQorCQlzdXBlci5kb1ZhbGlkYXRlU3RhdGUoZWxlbWVudCwgY29tcHV0YXRpb25Db250ZXh0KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShPYmplY3QgZWxlbWVudCkgew0KKwkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7DQorCQlpZiAoaW5mbyAhPSBudWxsKSB7DQorCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7DQorCQkJCXRyeSB7DQorCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsNCisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgew0KKwkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJCQlNZXNzYWdlcy5Db21yZWxEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZSwgZXgpOw0KKwkJCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gaW5mby5pc1JlYWRPbmx5KCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuaXNSZWFkT25seShlbGVtZW50KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7DQorCQlpZiAoIWlzU3RhdGVWYWxpZGF0ZWQoZWxlbWVudCkpIHsNCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dA0KKwkJCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCX0NCisJCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOw0KKwkJaWYgKGluZm8gIT0gbnVsbCkgew0KKwkJCWlmIChpbmZvLmlzVXBkYXRlQ2FjaGUoKSkgew0KKwkJCQl0cnkgew0KKwkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7DQorCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsNCisJCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCQkJTWVzc2FnZXMuQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGUsIGV4KTsNCisJCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlDQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIGluZm8uaXNNb2RpZmlhYmxlKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmlhYmxlKGVsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KKwkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7DQorCQlpZiAoaW5mbyAhPSBudWxsKSB7DQorCQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSBpbmZvLmdldExvYWRlZFJlc291cmNlc0l0ZXJhdG9yKCk7IGl0DQorCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSBpdC5uZXh0KCk7DQorCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOw0KKwkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7DQorCQkJCQlpbmZvLnNldFJlYWRPbmx5KHRydWUpOw0KKwkJCQkJaW5mby5zZXRNb2RpZmlhYmxlKGZhbHNlKTsNCisJCQkJCXJldHVybjsNCisJCQkJfQ0KKwkJCX0NCisJCQlpbmZvLnNldFJlYWRPbmx5KGZhbHNlKTsNCisJCQlpbmZvLnNldE1vZGlmaWFibGUodHJ1ZSk7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZVN0YXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOw0KKwkJaWYgKGluZm8gIT0gbnVsbCkgew0KKwkJCWluZm8uc2V0VXBkYXRlQ2FjaGUodHJ1ZSk7DQorCQl9DQorCQlzdXBlci5kb1VwZGF0ZVN0YXRlQ2FjaGUoZWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKE9iamVjdCBlbGVtZW50KSB7DQorCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsNCisJCWlmIChpbmZvICE9IG51bGwpIHsNCisJCQlyZXR1cm4gaW5mby5pc1N5bmNocm9uaXplZCgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmlzU3luY2hyb25pemVkKGVsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFJlc2V0UnVsZShPYmplY3QgZWxlbWVudCkgew0KKwkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7DQorCQlpZiAoaW5mbyAhPSBudWxsKSB7DQorCQkJTGlua2VkTGlzdDxJU2NoZWR1bGluZ1J1bGU+IHJ1bGVzID0gbmV3IExpbmtlZExpc3Q8SVNjaGVkdWxpbmdSdWxlPigpOw0KKwkJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gaW5mby5nZXRMb2FkZWRSZXNvdXJjZXNJdGVyYXRvcigpOyBpdA0KKwkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gaXQubmV4dCgpOw0KKwkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsNCisJCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpDQorCQkJCQkJCS5tb2RpZnlSdWxlKGZpbGUpKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgNCisJCQkJCShJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzDQorCQkJCQkJCS5zaXplKCldKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgew0KKwkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7DQorCQlpZiAoaW5mbyAhPSBudWxsKSB7DQorCQkJTGlua2VkTGlzdDxJU2NoZWR1bGluZ1J1bGU+IHJ1bGVzID0gbmV3IExpbmtlZExpc3Q8SVNjaGVkdWxpbmdSdWxlPigpOw0KKwkJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gaW5mby5nZXRMb2FkZWRSZXNvdXJjZXNJdGVyYXRvcigpOyBpdA0KKwkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gaXQubmV4dCgpOw0KKwkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsNCisJCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQkJcnVsZXMuYWRkKGNvbXB1dGVTY2hlZHVsaW5nUnVsZShmaWxlKSk7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoDQorCQkJCQkoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcw0KKwkJCQkJCQkuc2l6ZSgpXSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U3luY2hyb25pemVSdWxlKE9iamVjdCBlbGVtZW50KSB7DQorCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsNCisJCWlmIChpbmZvICE9IG51bGwpIHsNCisJCQlMaW5rZWRMaXN0PElTY2hlZHVsaW5nUnVsZT4gcnVsZXMgPSBuZXcgTGlua2VkTGlzdDxJU2NoZWR1bGluZ1J1bGU+KCk7DQorCQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSBpbmZvLmdldExvYWRlZFJlc291cmNlc0l0ZXJhdG9yKCk7IGl0DQorCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSBpdC5uZXh0KCk7DQorCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOw0KKwkJCQlpZiAoZmlsZSAhPSBudWxsKSB7DQorCQkJCQlydWxlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkNCisJCQkJCQkJLnJlZnJlc2hSdWxlKGZpbGUpKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgNCisJCQkJCShJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzDQorCQkJCQkJCS5zaXplKCldKSk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRWYWxpZGF0ZVN0YXRlUnVsZShPYmplY3QgZWxlbWVudCkgew0KKwkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7DQorCQlpZiAoaW5mbyAhPSBudWxsKSB7DQorCQkJTGlua2VkTGlzdDxJU2NoZWR1bGluZ1J1bGU+IGZpbGVzID0gbmV3IExpbmtlZExpc3Q8SVNjaGVkdWxpbmdSdWxlPigpOw0KKwkJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gaW5mby5nZXRMb2FkZWRSZXNvdXJjZXNJdGVyYXRvcigpOyBpdA0KKwkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gaXQubmV4dCgpOw0KKwkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsNCisJCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQkJZmlsZXMuYWRkKGZpbGUpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4NCisJCQkJCS5nZXRXb3Jrc3BhY2UoKQ0KKwkJCQkJLmdldFJ1bGVGYWN0b3J5KCkNCisJCQkJCS52YWxpZGF0ZUVkaXRSdWxlKA0KKwkJCQkJCQkoSUZpbGVbXSkgZmlsZXMudG9BcnJheShuZXcgSUZpbGVbZmlsZXMuc2l6ZSgpXSkpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVNjaGVkdWxpbmdSdWxlIGNvbXB1dGVTY2hlZHVsaW5nUnVsZShJUmVzb3VyY2UgdG9DcmVhdGVPck1vZGlmeSkgew0KKwkJaWYgKHRvQ3JlYXRlT3JNb2RpZnkuZXhpc3RzKCkpDQorCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpDQorCQkJCQkubW9kaWZ5UnVsZSh0b0NyZWF0ZU9yTW9kaWZ5KTsNCisNCisJCUlSZXNvdXJjZSBwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5Ow0KKwkJZG8gew0KKwkJCS8qDQorCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcg0KKwkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzYwMQ0KKwkJCSAqIElSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUgc2hvdWxkIGl0ZXJhdGUgdGhlIGhpZXJhcmNoeQ0KKwkJCSAqIGl0c2VsZi4NCisJCQkgKi8NCisJCQl0b0NyZWF0ZU9yTW9kaWZ5ID0gcGFyZW50Ow0KKwkJCXBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7DQorCQl9IHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpKTsNCisNCisJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQ0KKwkJCQkuY3JlYXRlUnVsZSh0b0NyZWF0ZU9yTW9kaWZ5KTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9TeW5jaHJvbml6ZShPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KKwkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOw0KKwkJaWYgKGluZm8gIT0gbnVsbCkgew0KKwkJCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gaW5mby5nZXRMb2FkZWRSZXNvdXJjZXNJdGVyYXRvcigpOyBpdA0KKwkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gaXQubmV4dCgpOw0KKwkJCQloYW5kbGVFbGVtZW50Q2hhbmdlZChpbmZvLCBuZXh0UmVzb3VyY2UsIG1vbml0b3IpOw0KKwkJCX0NCisJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwNCisJCQlJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQlWYWxpZGF0ZUFjdGlvbi5ydW5WYWxpZGF0aW9uKChWaWV3KSBkb2N1bWVudC5nZXRDb250ZW50KCkpOw0KKw0KKwkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7DQorCQlpZiAoaW5mbyAhPSBudWxsKSB7DQorCQkJaWYgKCFvdmVyd3JpdGUgJiYgIWluZm8uaXNTeW5jaHJvbml6ZWQoKSkgew0KKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigNCisJCQkJCQluZXcgU3RhdHVzKA0KKwkJCQkJCQkJSVN0YXR1cy5FUlJPUiwNCisJCQkJCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsDQorCQkJCQkJCQlJUmVzb3VyY2VTdGF0dXMuT1VUX09GX1NZTkNfTE9DQUwsDQorCQkJCQkJCQlNZXNzYWdlcy5Db21yZWxEb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvciwNCisJCQkJCQkJCW51bGwpKTsNCisJCQl9DQorCQkJaW5mby5zdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKTsNCisJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7DQorCQkJdHJ5IHsNCisJCQkJbW9uaXRvci5iZWdpblRhc2soDQorCQkJCQkJTWVzc2FnZXMuQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2ssIGluZm8NCisJCQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnNpemUoKSArIDEpOyAvLyJTYXZpbmcgZGlhZ3JhbSINCisJCQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSBpbmZvLmdldExvYWRlZFJlc291cmNlc0l0ZXJhdG9yKCk7IGl0DQorCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IGl0Lm5leHQoKTsNCisJCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoTkxTDQorCQkJCQkJCS5iaW5kKE1lc3NhZ2VzLkNvbXJlbERvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2ssDQorCQkJCQkJCQkJbmV4dFJlc291cmNlLmdldFVSSSgpKSk7DQorCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkNCisJCQkJCQkJJiYgIWluZm8uZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkJCQkJLmlzUmVhZE9ubHkobmV4dFJlc291cmNlKSkgew0KKwkJCQkJCXRyeSB7DQorCQkJCQkJCW5leHRSZXNvdXJjZS5zYXZlKENvbXJlbERpYWdyYW1FZGl0b3JVdGlsDQorCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOw0KKwkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisJCQkJCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsNCisJCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLA0KKwkJCQkJCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsDQorCQkJCQkJCQkJRWRpdG9yU3RhdHVzQ29kZXMuUkVTT1VSQ0VfRkFJTFVSRSwNCisJCQkJCQkJCQllLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KKwkJCQl9DQorCQkJCW1vbml0b3IuZG9uZSgpOw0KKwkJCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7DQorCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7DQorCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7DQorCQkJCXRocm93IHg7DQorCQkJfSBmaW5hbGx5IHsNCisJCQkJaW5mby5zdGFydFJlc291cmNlTGlzdGVuaW5nKCk7DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlVUkkgbmV3UmVzb3J1Y2VVUkk7DQorCQkJTGlzdDxJRmlsZT4gYWZmZWN0ZWRGaWxlcyA9IG51bGw7DQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsNCisJCQkJSUZpbGUgbmV3RmlsZSA9ICgoRmlsZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRGaWxlKCk7DQorCQkJCWFmZmVjdGVkRmlsZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ld0ZpbGUpOw0KKwkJCQluZXdSZXNvcnVjZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKG5ld0ZpbGUNCisJCQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsNCisJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgew0KKwkJCQluZXdSZXNvcnVjZVVSSSA9ICgoVVJJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFVSSSgpOw0KKwkJCX0gZWxzZSB7DQorCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7DQorCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKA0KKwkJCQkJCW5ldyBTdGF0dXMoDQorCQkJCQkJCQlJU3RhdHVzLkVSUk9SLA0KKwkJCQkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwNCisJCQkJCQkJCTAsDQorCQkJCQkJCQlOTFMuYmluZCgNCisJCQkJCQkJCQkJTWVzc2FnZXMuQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLA0KKwkJCQkJCQkJCQluZXcgT2JqZWN0W10gew0KKwkJCQkJCQkJCQkJCWVsZW1lbnQsDQorCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwgIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgDQorCQkJCQkJCQludWxsKSk7DQorCQkJfQ0KKwkJCWlmIChmYWxzZSA9PSBkb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsNCisJCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsNCisJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oDQorCQkJCQkJbmV3IFN0YXR1cygNCisJCQkJCQkJCUlTdGF0dXMuRVJST1IsDQorCQkJCQkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLklELA0KKwkJCQkJCQkJMCwNCisJCQkJCQkJCSJJbmNvcnJlY3QgZG9jdW1lbnQgdXNlZDogIiArIGRvY3VtZW50ICsgIiBpbnN0ZWFkIG9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRGlhZ3JhbURvY3VtZW50IiwgbnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCisJCQl9DQorCQkJSURpYWdyYW1Eb2N1bWVudCBkaWFncmFtRG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQ7DQorCQkJZmluYWwgUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBkaWFncmFtRG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpDQorCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShuZXdSZXNvcnVjZVVSSSk7DQorCQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtQ29weSA9IChEaWFncmFtKSBFY29yZVV0aWwNCisJCQkJCS5jb3B5KGRpYWdyYW1Eb2N1bWVudC5nZXREaWFncmFtKCkpOw0KKwkJCXRyeSB7DQorCQkJCW5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQkJCWRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCksDQorCQkJCQkJTkxTLmJpbmQoDQorCQkJCQkJCQlNZXNzYWdlcy5Db21yZWxEb2N1bWVudFByb3ZpZGVyX1NhdmVBc09wZXJhdGlvbiwNCisJCQkJCQkJCWRpYWdyYW1Db3B5LmdldE5hbWUoKSksIGFmZmVjdGVkRmlsZXMpIHsNCisJCQkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoDQorCQkJCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQ0KKwkJCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsNCisJCQkJCQluZXdSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtQ29weSk7DQorCQkJCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7DQorCQkJCQl9DQorCQkJCX0uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsNCisJCQkJbmV3UmVzb3VyY2Uuc2F2ZShDb21yZWxEaWFncmFtRWRpdG9yVXRpbC5nZXRTYXZlT3B0aW9ucygpKTsNCisJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgew0KKwkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOw0KKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsDQorCQkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwgMCwNCisJCQkJCQllLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOw0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisJCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsNCisJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLA0KKwkJCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsIDAsDQorCQkJCQkJZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG51bGwpKTsNCisJCQl9DQorCQkJbmV3UmVzb3VyY2UudW5sb2FkKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mbyBpbmZvLA0KKwkJCVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQorCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoY2hhbmdlZFJlc291cmNlKTsNCisJCWlmIChmaWxlICE9IG51bGwpIHsNCisJCQl0cnkgew0KKwkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOw0KKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsNCisJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbg0KKwkJCQkJCS5nZXRJbnN0YW5jZSgpDQorCQkJCQkJLmxvZ0Vycm9yKA0KKwkJCQkJCQkJTWVzc2FnZXMuQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQsDQorCQkJCQkJCQlleCk7DQorCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkDQorCQkJfQ0KKwkJfQ0KKwkJY2hhbmdlZFJlc291cmNlLnVubG9hZCgpOw0KKw0KKwkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsNCisJCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5mby5nZXRFZGl0b3JJbnB1dCgpLCBpbmZvKTsNCisJCWluZm8uZlN0YXR1cyA9IG51bGw7DQorCQl0cnkgew0KKwkJCXNldERvY3VtZW50Q29udGVudChpbmZvLmZEb2N1bWVudCwgaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsNCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KKwkJCWluZm8uZlN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7DQorCQl9DQorCQlpZiAoIWluZm8uZkNhbkJlU2F2ZWQpIHsNCisJCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7DQorCQl9DQorCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7DQorCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUVkaXRvcklucHV0IGlucHV0LCBVUkkgdXJpKSB7DQorCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsNCisJCQlJRmlsZSBuZXdGaWxlID0gUmVzb3VyY2VzUGx1Z2luDQorCQkJCQkuZ2V0V29ya3NwYWNlKCkNCisJCQkJCS5nZXRSb290KCkNCisJCQkJCS5nZXRGaWxlKA0KKwkJCQkJCQluZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKQ0KKwkJCQkJCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsNCisJCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXdGaWxlID09IG51bGwgPyBudWxsDQorCQkJCQk6IG5ldyBGaWxlRWRpdG9ySW5wdXQobmV3RmlsZSkpOw0KKwkJCXJldHVybjsNCisJCX0NCisJCS8vIFRPRE86IGFwcGVuZCBzdWZmaXggdG8gdGhlIFVSSSEgKHVzZSBkaWFncmFtIGFzIGEgcGFyYW1ldGVyKQ0KKwkJZmlyZUVsZW1lbnRNb3ZlZChpbnB1dCwgbmV3IFVSSUVkaXRvcklucHV0KHVyaSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUVkaXRvcklucHV0IGNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oSUVkaXRvcklucHV0IGVkaXRvcklucHV0LA0KKwkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgew0KKwkJcmV0dXJuIGVkaXRvcklucHV0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSURpYWdyYW1Eb2N1bWVudCBnZXREaWFncmFtRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsNCisJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsNCisJCWlmIChkb2MgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7DQorCQkJcmV0dXJuIChJRGlhZ3JhbURvY3VtZW50KSBkb2M7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBjbGFzcyBSZXNvdXJjZVNldEluZm8gZXh0ZW5kcyBFbGVtZW50SW5mbyB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBsb25nIG15TW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFdvcmtzcGFjZVN5bmNocm9uaXplciBteVN5bmNocm9uaXplcjsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIExpbmtlZExpc3Q8UmVzb3VyY2U+IG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMgPSBuZXcgTGlua2VkTGlzdDxSZXNvdXJjZT4oKTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIElEaWFncmFtRG9jdW1lbnQgbXlEb2N1bWVudDsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIElFZGl0b3JJbnB1dCBteUVkaXRvcklucHV0Ow0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgYm9vbGVhbiBteVVwZGF0ZUNhY2hlID0gdHJ1ZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIGJvb2xlYW4gbXlNb2RpZmlhYmxlID0gZmFsc2U7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBib29sZWFuIG15UmVhZE9ubHkgPSB0cnVlOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBteVJlc291cmNlU2V0TGlzdGVuZXI7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlc291cmNlU2V0SW5mbyhJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50LA0KKwkJCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsNCisJCQlzdXBlcihkb2N1bWVudCk7DQorCQkJbXlEb2N1bWVudCA9IGRvY3VtZW50Ow0KKwkJCW15RWRpdG9ySW5wdXQgPSBlZGl0b3JJbnB1dDsNCisJCQlzdGFydFJlc291cmNlTGlzdGVuaW5nKCk7DQorCQkJbXlSZXNvdXJjZVNldExpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIodGhpcyk7DQorCQkJZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQobXlSZXNvdXJjZVNldExpc3RlbmVyKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsNCisJCQlyZXR1cm4gbXlNb2RpZmljYXRpb25TdGFtcDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25TdGFtcChsb25nIG1vZGlmaWNhdGlvblN0YW1wKSB7DQorCQkJbXlNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgew0KKwkJCXJldHVybiBteURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7DQorCQkJcmV0dXJuIGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBJdGVyYXRvcjxSZXNvdXJjZT4gZ2V0TG9hZGVkUmVzb3VyY2VzSXRlcmF0b3IoKSB7DQorCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpDQorCQkJCQkuaXRlcmF0b3IoKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgSUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KCkgew0KKwkJCXJldHVybiBteUVkaXRvcklucHV0Ow0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorCQkJc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7DQorCQkJZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUobXlSZXNvdXJjZVNldExpc3RlbmVyKTsNCisJCQlmb3IgKEl0ZXJhdG9yPFJlc291cmNlPiBpdCA9IGdldExvYWRlZFJlc291cmNlc0l0ZXJhdG9yKCk7IGl0DQorCQkJCQkuaGFzTmV4dCgpOykgew0KKwkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGl0Lm5leHQoKTsNCisJCQkJcmVzb3VyY2UudW5sb2FkKCk7DQorCQkJfQ0KKwkJCWdldEVkaXRpbmdEb21haW4oKS5kaXNwb3NlKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7DQorCQkJcmV0dXJuIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuc2l6ZSgpID09IDA7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgc2V0VW5TeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsNCisJCQlteVVuU3luY2hyb25pemVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7DQorCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBmaW5hbCB2b2lkIHN0b3BSZXNvdXJjZUxpc3RlbmluZygpIHsNCisJCQlteVN5bmNocm9uaXplci5kaXNwb3NlKCk7DQorCQkJbXlTeW5jaHJvbml6ZXIgPSBudWxsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKSB7DQorCQkJbXlTeW5jaHJvbml6ZXIgPSBuZXcgV29ya3NwYWNlU3luY2hyb25pemVyKGdldEVkaXRpbmdEb21haW4oKSwNCisJCQkJCW5ldyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSgpKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNhY2hlKCkgew0KKwkJCXJldHVybiBteVVwZGF0ZUNhY2hlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHNldFVwZGF0ZUNhY2hlKGJvb2xlYW4gdXBkYXRlKSB7DQorCQkJbXlVcGRhdGVDYWNoZSA9IHVwZGF0ZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7DQorCQkJcmV0dXJuIG15TW9kaWZpYWJsZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmlhYmxlKGJvb2xlYW4gbW9kaWZpYWJsZSkgew0KKwkJCW15TW9kaWZpYWJsZSA9IG1vZGlmaWFibGU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsNCisJCQlyZXR1cm4gbXlSZWFkT25seTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7DQorCQkJbXlSZWFkT25seSA9IHJlYWRPbmx5Ow0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgY2xhc3MgU3luY2hyb25pemVyRGVsZWdhdGUgaW1wbGVtZW50cw0KKwkJCQlXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuRGVsZWdhdGUgew0KKw0KKwkJCS8qKg0KKwkJCSAqIEBnZW5lcmF0ZWQNCisJCQkgKi8NCisJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJCX0NCisNCisJCQkvKioNCisJCQkgKiBAZ2VuZXJhdGVkDQorCQkJICovDQorCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VDaGFuZ2VkKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7DQorCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsNCisJCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgew0KKwkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsNCisJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mby50aGlzLCByZXNvdXJjZSwNCisJCQkJCQkJCW51bGwpOw0KKwkJCQkJfQ0KKwkJCQl9KTsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKw0KKwkJCS8qKg0KKwkJCSAqIEBnZW5lcmF0ZWQNCisJCQkgKi8NCisJCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZURlbGV0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsNCisJCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgew0KKwkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7DQorCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOw0KKwkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQorCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJZmlyZUVsZW1lbnREZWxldGVkKFJlc291cmNlU2V0SW5mby50aGlzDQorCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSk7DQorCQkJCQl9DQorCQkJCX0pOw0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorDQorCQkJLyoqDQorCQkJICogQGdlbmVyYXRlZA0KKwkJCSAqLw0KKwkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlTW92ZWQoUmVzb3VyY2UgcmVzb3VyY2UsDQorCQkJCQlmaW5hbCBVUkkgbmV3VVJJKSB7DQorCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsNCisJCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgew0KKwkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsNCisJCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlpZiAobXlEb2N1bWVudC5nZXREaWFncmFtKCkuZVJlc291cmNlKCkgPT0gcmVzb3VyY2UpIHsNCisJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQloYW5kbGVFbGVtZW50TW92ZWQoDQorCQkJCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuZ2V0RWRpdG9ySW5wdXQoKSwNCisJCQkJCQkJCQluZXdVUkkpOw0KKwkJCQkJCX0NCisJCQkJCX0pOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJaGFuZGxlUmVzb3VyY2VEZWxldGVkKHJlc291cmNlKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorDQorCQl9DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzIEVDb250ZW50QWRhcHRlciB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBOb3RpZmljYXRpb25GaWx0ZXIgbXlNb2RpZmllZEZpbHRlcjsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFJlc291cmNlU2V0SW5mbyBteUluZm87DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsNCisJCQlteUluZm8gPSBpbmZvOw0KKwkJCW15TW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXINCisJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLlNFVCkNCisJCQkJCS5vcihOb3RpZmljYXRpb25GaWx0ZXINCisJCQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uVU5TRVQpKQ0KKwkJCQkJLmFuZChOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcihSZXNvdXJjZS5jbGFzcywNCisJCQkJCQkJUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVEKSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2VTZXQpIHsNCisJCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwkJCX0NCisJCQlpZiAoIW5vdGlmaWNhdGlvbi5pc1RvdWNoKCkNCisJCQkJCSYmIG15TW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7DQorCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7DQorCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7DQorCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgew0KKwkJCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsNCisJCQkJCQlmb3IgKEl0ZXJhdG9yLyo8b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlPiovaXQgPSBteUluZm8NCisJCQkJCQkJCS5nZXRMb2FkZWRSZXNvdXJjZXNJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCkNCisJCQkJCQkJCSYmICFtb2RpZmllZDspIHsNCisJCQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7DQorCQkJCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgew0KKwkJCQkJCQkJbW9kaWZpZWQgPSBuZXh0UmVzb3VyY2UuaXNNb2RpZmllZCgpOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJCWJvb2xlYW4gZGlydHlTdGF0ZUNoYW5nZWQgPSBmYWxzZTsNCisJCQkJCQlzeW5jaHJvbml6ZWQgKG15SW5mbykgew0KKwkJCQkJCQlpZiAobW9kaWZpZWQgIT0gbXlJbmZvLmZDYW5CZVNhdmVkKSB7DQorCQkJCQkJCQlteUluZm8uZkNhbkJlU2F2ZWQgPSBtb2RpZmllZDsNCisJCQkJCQkJCWRpcnR5U3RhdGVDaGFuZ2VkID0gdHJ1ZTsNCisJCQkJCQkJfQ0KKwkJCQkJCQlpZiAoIXJlc291cmNlLmlzTW9kaWZpZWQoKSkgew0KKwkJCQkJCQkJbXlJbmZvLnNldFN5bmNocm9uaXplZChyZXNvdXJjZSk7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQkJaWYgKGRpcnR5U3RhdGVDaGFuZ2VkKSB7DQorCQkJCQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoDQorCQkJCQkJCQkJbXlJbmZvLmdldEVkaXRvcklucHV0KCksIG1vZGlmaWVkKTsNCisNCisJCQkJCQkJaWYgKCFtb2RpZmllZCkgew0KKwkJCQkJCQkJbXlJbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChteUluZm8pKTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRWxlbWVudENob29zZXJEaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxFbGVtZW50Q2hvb3NlckRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZWUzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsRWxlbWVudENob29zZXJEaWFsb2cuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxFbGVtZW50Q2hvb3NlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRyZWVWaWV3ZXIgbXlUcmVlVmlld2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBVUkkgbXlTZWxlY3RlZE1vZGVsRWxlbWVudFVSSTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVmlldyBteVZpZXc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFDQorCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxFbGVtZW50Q2hvb3NlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVmlldyB2aWV3KSB7DQorCQlzdXBlcihwYXJlbnRTaGVsbCk7DQorCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOw0KKwkJbXlWaWV3ID0gdmlldzsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7DQorCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOw0KKwkJZ2V0U2hlbGwoKS5zZXRUZXh0KA0KKwkJCQlNZXNzYWdlcy5Db21yZWxFbGVtZW50Q2hvb3NlckRpYWxvZ19TZWxlY3RNb2RlbEVsZW1lbnRUaXRsZSk7DQorCQljcmVhdGVNb2RlbEJyb3dzZXIoY29tcG9zaXRlKTsNCisJCXJldHVybiBjb21wb3NpdGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7DQorCQlDb250cm9sIGJ1dHRvbkJhciA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOw0KKwkJc2V0T2tCdXR0b25FbmFibGVkKGZhbHNlKTsNCisJCXJldHVybiBidXR0b25CYXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBjcmVhdGVNb2RlbEJyb3dzZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJbXlUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMDQorCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7DQorCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQorCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSAzMDA7DQorCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDMwMDsNCisJCW15VHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsNCisJCW15VHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1vZGVsRWxlbWVudHNUcmVlQ29udGVudFByb3ZpZGVyKCkpOw0KKwkJbXlUcmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IE1vZGVsRWxlbWVudHNUcmVlTGFiZWxQcm92aWRlcigpKTsNCisJCW15VHJlZVZpZXdlci5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCisJCW15VHJlZVZpZXdlci5hZGRGaWx0ZXIobmV3IE1vZGVsRmlsZXNGaWx0ZXIoKSk7DQorCQlteVRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBPa0J1dHRvbkVuYWJsZXIoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgdm9pZCBzZXRPa0J1dHRvbkVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7DQorCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChlbmFibGVkKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRNb2RlbEZpbGUoSUZpbGUgZmlsZSkgew0KKwkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlLmdldEZ1bGxQYXRoKCkuZ2V0RmlsZUV4dGVuc2lvbigpOw0KKwkJcmV0dXJuICJjb21yZWwiLmVxdWFscyhmaWxlRXh0ZW5zaW9uKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVVJJIGdldFNlbGVjdGVkTW9kZWxFbGVtZW50VVJJKCkgew0KKwkJcmV0dXJuIG15U2VsZWN0ZWRNb2RlbEVsZW1lbnRVUkk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBpbnQgb3BlbigpIHsNCisJCWludCByZXN1bHQgPSBzdXBlci5vcGVuKCk7DQorCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkNCisJCQkJLmdldFJlc291cmNlcygpKSB7DQorCQkJcmVzb3VyY2UudW5sb2FkKCk7DQorCQl9DQorCQlteUVkaXRpbmdEb21haW4uZGlzcG9zZSgpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBjbGFzcyBNb2RlbEVsZW1lbnRzVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzDQorCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByaXZhdGUgSVRyZWVDb250ZW50UHJvdmlkZXIgbXlXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigNCisJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsNCisJCQlPYmplY3RbXSByZXN1bHQgPSBteVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcg0KKwkJCQkJLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOw0KKwkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkgew0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7DQorCQkJCUlGaWxlIG1vZGVsRmlsZSA9IChJRmlsZSkgcGFyZW50RWxlbWVudDsNCisJCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gbW9kZWxGaWxlLmdldEZ1bGxQYXRoKCk7DQorCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7DQorCQkJCXRyeSB7DQorCQkJCQlSZXNvdXJjZSBtb2RlbFJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoDQorCQkJCQkJCVVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKA0KKwkJCQkJCQkJCXJlc291cmNlUGF0aC50b1N0cmluZygpLCB0cnVlKSwgdHJ1ZSk7DQorCQkJCQlyZXR1cm4gbXlBZGFwdGVyRmN0b3J5Q29udGVudFByb3ZpZXINCisJCQkJCQkJLmdldENoaWxkcmVuKG1vZGVsUmVzb3VyY2UpOw0KKwkJCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsNCisJCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4NCisJCQkJCQkJLmdldEluc3RhbmNlKCkNCisJCQkJCQkJLmxvZ0Vycm9yKA0KKwkJCQkJCQkJCSJVbmFibGUgdG8gbG9hZCByZXNvdXJjZTogIiArIHJlc291cmNlUGF0aC50b1N0cmluZygpLCBlKTsgLy8kTk9OLU5MUy0xJA0KKwkJCQl9DQorCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsNCisJCQl9DQorCQkJcmV0dXJuIG15QWRhcHRlckZjdG9yeUNvbnRlbnRQcm92aWVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IG15V29ya2JlbmNoQ29udGVudFByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsNCisJCQlpZiAocGFyZW50ICE9IG51bGwpIHsNCisJCQkJcmV0dXJuIHBhcmVudDsNCisJCQl9DQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7DQorCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBlbGVtZW50Ow0KKwkJCQlpZiAoZU9iamVjdC5lQ29udGFpbmVyKCkgPT0gbnVsbA0KKwkJCQkJCSYmIGVPYmplY3QuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsNCisJCQkJCVN0cmluZyBwYXRoID0gZU9iamVjdC5lUmVzb3VyY2UoKS5nZXRVUkkoKS5wYXRoKCk7DQorCQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQ0KKwkJCQkJCQkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gbXlBZGFwdGVyRmN0b3J5Q29udGVudFByb3ZpZXIuZ2V0UGFyZW50KGVPYmplY3QpOw0KKwkJCX0NCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgew0KKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsNCisJCQkJcmV0dXJuIGlzVmFsaWRNb2RlbEZpbGUoKElGaWxlKSBlbGVtZW50KTsNCisJCQl9DQorCQkJcmV0dXJuIG15V29ya2JlbmNoQ29udGVudFByb3ZpZGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpDQorCQkJCQl8fCBteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllci5oYXNDaGlsZHJlbihlbGVtZW50KTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KKwkJCU9iamVjdFtdIGVsZW1lbnRzID0gbXlXb3JrYmVuY2hDb250ZW50UHJvdmlkZXINCisJCQkJCS5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOw0KKwkJCXJldHVybiBlbGVtZW50czsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJCW15V29ya2JlbmNoQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCQlteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllci5kaXNwb3NlKCk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7DQorCQkJbXlXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsNCisJCQlteUFkYXB0ZXJGY3RvcnlDb250ZW50UHJvdmllci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwNCisJCQkJCW5ld0lucHV0KTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBjbGFzcyBNb2RlbEVsZW1lbnRzVHJlZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIG15V29ya2JlbmNoTGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgbXlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKA0KKwkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkNCisJCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpOw0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgew0KKwkJCUltYWdlIHJlc3VsdCA9IG15V29ya2JlbmNoTGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsNCisJCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBteUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcg0KKwkJCQkJLmdldEltYWdlKGVsZW1lbnQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KKwkJCVN0cmluZyByZXN1bHQgPSBteVdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsNCisJCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCA/IHJlc3VsdA0KKwkJCQkJOiBteUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCQlteVdvcmtiZW5jaExhYmVsUHJvdmlkZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOw0KKwkJCW15QWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJCW15V29ya2JlbmNoTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7DQorCQkJbXlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7DQorCQkJcmV0dXJuIG15V29ya2JlbmNoTGFiZWxQcm92aWRlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpDQorCQkJCQl8fCBteUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwNCisJCQkJCQkJcHJvcGVydHkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCQlteVdvcmtiZW5jaExhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOw0KKwkJCW15QWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBjbGFzcyBNb2RlbEZpbGVzRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsDQorCQkJCU9iamVjdCBlbGVtZW50KSB7DQorCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7DQorCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7DQorCQkJCXJldHVybiBpc1ZhbGlkTW9kZWxGaWxlKGZpbGUpOw0KKwkJCX0NCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBjbGFzcyBPa0J1dHRvbkVuYWJsZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KKwkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7DQorCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQNCisJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7DQorCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsNCisJCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQorCQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsNCisJCQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZEVsZW1lbnQpDQorCQkJCQkJCQkuZ2V0VmFsdWUoKTsNCisJCQkJCX0NCisJCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGZWF0dXJlTWFwLkVudHJ5KSB7DQorCQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChGZWF0dXJlTWFwLkVudHJ5KSBzZWxlY3RlZEVsZW1lbnQpDQorCQkJCQkJCQkuZ2V0VmFsdWUoKTsNCisJCQkJCX0NCisJCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7DQorCQkJCQkJRU9iamVjdCBzZWxlY3RlZE1vZGVsRWxlbWVudCA9IChFT2JqZWN0KSBzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCQkJc2V0T2tCdXR0b25FbmFibGVkKFZpZXdTZXJ2aWNlDQorCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJCQkJLnByb3ZpZGVzKA0KKwkJCQkJCQkJCQlOb2RlLmNsYXNzLA0KKwkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoc2VsZWN0ZWRNb2RlbEVsZW1lbnQpLA0KKwkJCQkJCQkJCQlteVZpZXcsDQorCQkJCQkJCQkJCW51bGwsDQorCQkJCQkJCQkJCVZpZXdVdGlsLkFQUEVORCwNCisJCQkJCQkJCQkJdHJ1ZSwNCisJCQkJCQkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsNCisJCQkJCQlteVNlbGVjdGVkTW9kZWxFbGVtZW50VVJJID0gRWNvcmVVdGlsDQorCQkJCQkJCQkuZ2V0VVJJKHNlbGVjdGVkTW9kZWxFbGVtZW50KTsNCisJCQkJCQlyZXR1cm47DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJbXlTZWxlY3RlZE1vZGVsRWxlbWVudFVSSSA9IG51bGw7DQorCQkJc2V0T2tCdXR0b25FbmFibGVkKGZhbHNlKTsNCisJCX0NCisNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1N2NiYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxJbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxJbml0RGlhZ3JhbUZpbGVBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBVUkkgZG9tYWluTW9kZWxVUkk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7DQorCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJZG9tYWluTW9kZWxVUkkgPSBudWxsOw0KKwkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOw0KKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uID09IGZhbHNlDQorCQkJCXx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlJRmlsZSBmaWxlID0gKElGaWxlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pDQorCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsNCisJCWRvbWFpbk1vZGVsVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpDQorCQkJCS50b1N0cmluZygpLCB0cnVlKTsNCisJCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgew0KKwkJcmV0dXJuIHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgew0KKwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IEdNRkVkaXRpbmdEb21haW5GYWN0b3J5LklOU1RBTkNFDQorCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7DQorCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsNCisJCUVPYmplY3QgZGlhZ3JhbVJvb3QgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGRvbWFpbk1vZGVsVVJJLCB0cnVlKTsNCisJCQlkaWFncmFtUm9vdCA9IChFT2JqZWN0KSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsNCisJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBkb21haW5Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlpZiAoZGlhZ3JhbVJvb3QgPT0gbnVsbCkgew0KKwkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksDQorCQkJCQlNZXNzYWdlcy5Jbml0RGlhZ3JhbUZpbGVfUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlLA0KKwkJCQkJTWVzc2FnZXMuSW5pdERpYWdyYW1GaWxlX1Jlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlKTsNCisJCQlyZXR1cm47DQorCQl9DQorCQlXaXphcmQgd2l6YXJkID0gbmV3IENvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkKGRvbWFpbk1vZGVsVVJJLA0KKwkJCQlkaWFncmFtUm9vdCwgZWRpdGluZ0RvbWFpbik7DQorCQl3aXphcmQuc2V0V2luZG93VGl0bGUoTkxTLmJpbmQoTWVzc2FnZXMuSW5pdERpYWdyYW1GaWxlX1dpemFyZFRpdGxlLA0KKwkJCQlDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lEKSk7DQorCQlDb21yZWxEaWFncmFtRWRpdG9yVXRpbA0KKwkJCQkucnVuV2l6YXJkKGdldFNoZWxsKCksIHdpemFyZCwgIkluaXREaWFncmFtRmlsZSIpOyAvLyROT04tTkxTLTEkDQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbExpbmtEZXNjcmlwdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsTGlua0Rlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDEwODRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbExpbmtEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxMaW5rRGVzY3JpcHRvciBleHRlbmRzIENvbXJlbE5vZGVEZXNjcmlwdG9yIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRU9iamVjdCBteVNvdXJjZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRU9iamVjdCBteURlc3RpbmF0aW9uOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJQWRhcHRhYmxlIG15U2VtYW50aWNBZGFwdGVyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBDb21yZWxMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwNCisJCQlFT2JqZWN0IGxpbmtFbGVtZW50LCBpbnQgbGlua1ZJRCkgew0KKwkJc3VwZXIobGlua0VsZW1lbnQsIGxpbmtWSUQpOw0KKwkJbXlTb3VyY2UgPSBzb3VyY2U7DQorCQlteURlc3RpbmF0aW9uID0gZGVzdGluYXRpb247DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwNCisJCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7DQorCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIChFT2JqZWN0KSBudWxsLCBsaW5rVklEKTsNCisJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsNCisJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IElBZGFwdGFibGUoKSB7DQorCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsNCisJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsNCisJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7DQorCQkJCX0NCisJCQkJcmV0dXJuIG51bGw7DQorCQkJfQ0KKwkJfTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLA0KKwkJCUVPYmplY3QgbGlua0VsZW1lbnQsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsNCisJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua0VsZW1lbnQsIGxpbmtWSUQpOw0KKwkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOw0KKwkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgRU9iamVjdEFkYXB0ZXIobGlua0VsZW1lbnQpIHsNCisJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgew0KKwkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgew0KKwkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsNCisJCQl9DQorCQl9Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRU9iamVjdCBnZXRTb3VyY2UoKSB7DQorCQlyZXR1cm4gbXlTb3VyY2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgew0KKwkJcmV0dXJuIG15RGVzdGluYXRpb247DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJQWRhcHRhYmxlIGdldFNlbWFudGljQWRhcHRlcigpIHsNCisJCXJldHVybiBteVNlbWFudGljQWRhcHRlcjsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbE1hdGNoaW5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkwODgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbE1hdGNoaW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7DQorCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7DQorCQl0cnkgew0KKwkJCWVkaXRvcklucHV0ID0gZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCk7DQorCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKw0KKwkJaWYgKGVkaXRvcklucHV0LmVxdWFscyhpbnB1dCkpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0DQorCQkJCSYmIGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsNCisJCQlyZXR1cm4gKChVUklFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFVSSSgpLmVxdWFscygNCisJCQkJCSgoVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVhZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZCBleHRlbmRzIFdpemFyZCB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgbXlGaWxlQ3JlYXRpb25QYWdlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZChVUkkgZG9tYWluTW9kZWxVUkksIEVPYmplY3QgZGlhZ3JhbVJvb3QsDQorCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgew0KKwkJYXNzZXJ0IGRvbWFpbk1vZGVsVVJJICE9IG51bGwgOiAiRG9tYWluIG1vZGVsIHVyaSBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQNCisJCWFzc2VydCBkaWFncmFtUm9vdCAhPSBudWxsIDogIkRvYWdyYW0gcm9vdCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJA0KKwkJYXNzZXJ0IGVkaXRpbmdEb21haW4gIT0gbnVsbCA6ICJFZGl0aW5nIGRvbWFpbiBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQNCisNCisJCW15RmlsZUNyZWF0aW9uUGFnZSA9IG5ldyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKA0KKwkJCQlNZXNzYWdlcy5Db21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lLA0KKwkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsNCisJCW15RmlsZUNyZWF0aW9uUGFnZQ0KKwkJCQkuc2V0VGl0bGUoTWVzc2FnZXMuQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGUpOw0KKwkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKE5MUy5iaW5kKA0KKwkJCQlNZXNzYWdlcy5Db21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbiwNCisJCQkJQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRCkpOw0KKwkJSVBhdGggZmlsZVBhdGg7DQorCQlTdHJpbmcgZmlsZU5hbWUgPSBVUkkuZGVjb2RlKGRvbWFpbk1vZGVsVVJJLnRyaW1GaWxlRXh0ZW5zaW9uKCkNCisJCQkJLmxhc3RTZWdtZW50KCkpOw0KKwkJaWYgKGRvbWFpbk1vZGVsVVJJLmlzUGxhdGZvcm1SZXNvdXJjZSgpKSB7DQorCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkNCisJCQkJCS50b1BsYXRmb3JtU3RyaW5nKHRydWUpKTsNCisJCX0gZWxzZSBpZiAoZG9tYWluTW9kZWxVUkkuaXNGaWxlKCkpIHsNCisJCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKSk7DQorCQl9IGVsc2Ugew0KKwkJCS8vIFRPRE8gOiB1c2Ugc29tZSBkZWZhdWx0IHBhdGgNCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KKwkJCQkJIlVuc3VwcG9ydGVkIFVSSTogIiArIGRvbWFpbk1vZGVsVVJJKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKGZpbGVQYXRoKTsNCisJCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShDb21yZWxEaWFncmFtRWRpdG9yVXRpbA0KKwkJCQkuZ2V0VW5pcXVlRmlsZU5hbWUoZmlsZVBhdGgsIGZpbGVOYW1lLCAiY29tcmVsX2RpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQNCisNCisJCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgPSBuZXcgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSgNCisJCQkJTWVzc2FnZXMuQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lKTsNCisJCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UNCisJCQkJLnNldFRpdGxlKE1lc3NhZ2VzLkNvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGUpOw0KKwkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQ0KKwkJCQkuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbik7DQorCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLnNldE1vZGVsRWxlbWVudChkaWFncmFtUm9vdCk7DQorDQorCQlteUVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCisJCWFkZFBhZ2UobXlGaWxlQ3JlYXRpb25QYWdlKTsNCisJCWFkZFBhZ2UoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7DQorCQlMaW5rZWRMaXN0PElGaWxlPiBhZmZlY3RlZEZpbGVzID0gbmV3IExpbmtlZExpc3Q8SUZpbGU+KCk7DQorCQlJRmlsZSBkaWFncmFtRmlsZSA9IG15RmlsZUNyZWF0aW9uUGFnZS5jcmVhdGVOZXdGaWxlKCk7DQorCQlDb21yZWxEaWFncmFtRWRpdG9yVXRpbC5zZXRDaGFyc2V0KGRpYWdyYW1GaWxlKTsNCisJCWFmZmVjdGVkRmlsZXMuYWRkKGRpYWdyYW1GaWxlKTsNCisJCVVSSSBkaWFncmFtTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQ0KKwkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsNCisJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7DQorCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSByZXNvdXJjZVNldA0KKwkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbU1vZGVsVVJJKTsNCisJCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKA0KKwkJCQlteUVkaXRpbmdEb21haW4sDQorCQkJCU1lc3NhZ2VzLkNvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZCwNCisJCQkJYWZmZWN0ZWRGaWxlcykgew0KKw0KKwkJCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoDQorCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCisJCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gew0KKwkJCQlpbnQgZGlhZ3JhbVZJRCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0RGlhZ3JhbVZpc3VhbElEKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UNCisJCQkJCQkJCS5nZXRNb2RlbEVsZW1lbnQoKSk7DQorCQkJCWlmIChkaWFncmFtVklEICE9IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuVklTVUFMX0lEKSB7DQorCQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdA0KKwkJCQkJCQkubmV3RXJyb3JDb21tYW5kUmVzdWx0KE1lc3NhZ2VzLkNvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcik7DQorCQkJCX0NCisJCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbSgNCisJCQkJCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLmdldE1vZGVsRWxlbWVudCgpLA0KKwkJCQkJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTU9ERUxfSUQsDQorCQkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOw0KKwkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7DQorCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOw0KKwkJCX0NCisJCX07DQorCQl0cnkgew0KKwkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsDQorCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsNCisJCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShDb21yZWxEaWFncmFtRWRpdG9yVXRpbC5nZXRTYXZlT3B0aW9ucygpKTsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtUmVzb3VyY2UpOw0KKwkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkDQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCSJTYXZlIG9wZXJhdGlvbiBmYWlsZWQgZm9yOiAiICsgZGlhZ3JhbU1vZGVsVVJJLCBleCk7IC8vJE5PTi1OTFMtMSQNCisJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlVuYWJsZSB0byBvcGVuIGVkaXRvciIsIGV4KTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGNsYXNzIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcw0KKwkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2Ugew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgew0KKwkJCXN1cGVyKHBhZ2VOYW1lKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGlvblRpdGxlKCkgew0KKwkJCXJldHVybiBNZXNzYWdlcy5Db21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsNCisJCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPT0gbnVsbCkgew0KKwkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2UpOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCWJvb2xlYW4gcmVzdWx0ID0gVmlld1NlcnZpY2UNCisJCQkJCS5nZXRJbnN0YW5jZSgpDQorCQkJCQkucHJvdmlkZXMoDQorCQkJCQkJCW5ldyBDcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbigNCisJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoc2VsZWN0ZWRNb2RlbEVsZW1lbnQpLA0KKwkJCQkJCQkJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTU9ERUxfSUQsDQorCQkJCQkJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsNCisJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0ID8gbnVsbA0KKwkJCQkJOiBNZXNzYWdlcy5Db21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlKTsNCisJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxOb2RlRGVzY3JpcHRvci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbE5vZGVEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmMjk2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxOb2RlRGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbE5vZGVEZXNjcmlwdG9yIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgRU9iamVjdCBteU1vZGVsRWxlbWVudDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgaW50IG15VmlzdWFsSUQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcmVsTm9kZURlc2NyaXB0b3IoRU9iamVjdCBtb2RlbEVsZW1lbnQsIGludCB2aXN1YWxJRCkgew0KKwkJbXlNb2RlbEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQ7DQorCQlteVZpc3VhbElEID0gdmlzdWFsSUQ7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFT2JqZWN0IGdldE1vZGVsRWxlbWVudCgpIHsNCisJCXJldHVybiBteU1vZGVsRWxlbWVudDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGludCBnZXRWaXN1YWxJRCgpIHsNCisJCXJldHVybiBteVZpc3VhbElEOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxQYWxldHRlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbFBhbGV0dGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiYzc0ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxQYWxldHRlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzQ0IEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ub29sOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlRHJhd2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQorDQoraW1wb3J0IGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LmN1c3RvbS5Ub29sRW50cnlDb21wYXJhdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LmN1c3RvbS5VbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2xXaXRoVW5pdElkOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KK2ltcG9ydCBjb21yZWwuaW1wbC5Db21wb3NpdGVSZWZhY3RvcmluZ0ltcGw7DQoraW1wb3J0IGNvbXJlbC51dGlsLkNvbXJlbFV0aWw7DQoraW1wb3J0IGNvbXJlbC51dGlsLlJlZ2lzdHJ5VXRpbDsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbFBhbGV0dGVGYWN0b3J5IHsNCisNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JVF9JRCA9ICJVTklUX0lEIjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGZpbGxQYWxldHRlKFBhbGV0dGVSb290IHBhbGV0dGVSb290KSB7DQorCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlQ29tcG9zaXRlVW5pdHMxR3JvdXAoKSk7DQorCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlQXRvbWljVW5pdHMyR3JvdXAoKSk7DQorCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlRmlsdGVyVW5pdHMzR3JvdXAoKSk7DQorCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlRmVhdHVyZVVuaXRzNEdyb3VwKCkpOw0KKwkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZVBvcnRzNUdyb3VwKCkpOw0KKwkJcGFsZXR0ZVJvb3QuYWRkKGNyZWF0ZU1hcHBpbmdzNkdyb3VwKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBFcnN0ZWxsdCBhbGxlIG72dGlnZW4gVG9vbGVpbnRy5GdlIGb8ciBhbGxlIHZlcmb8Z2JhcmVuIEF0b21pY1VOaXRzDQorCSAqIA0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwcml2YXRlIEVMaXN0PFRvb2xFbnRyeT4gY3JlYXRlQXRvbWljVW5pdHMoKSB7DQorCQlFTGlzdDxUb29sRW50cnk+IGVyZyA9IG5ldyBCYXNpY0VMaXN0PFRvb2xFbnRyeT4oKTsNCisJCUNvbGxlY3Rpb248TW9kZWxSZWZhY3RvcmluZz4gcmVmYWN0b3JpbmdzID0gUmVnaXN0cnlVdGlsDQorCQkJCS5nZXRFbWZSZWZhY3RvcmluZ3NBc01vZGVsUmVmYWN0b3JpbmdzKENvbXBvc2l0ZVJlZmFjdG9yaW5nSW1wbC5uc1VyaSk7DQorCQlyZWZhY3RvcmluZ3MgPSBDb21yZWxVdGlsLnNvcnRBdG9taWNSZWZhY3RvcmluZ3MocmVmYWN0b3JpbmdzKTsNCisJCUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlczsNCisJCWZvciAoTW9kZWxSZWZhY3RvcmluZyByZWYgOiByZWZhY3RvcmluZ3MpIHsNCisJCQlpZiAocmVmLmdldE5hbWVzcGFjZVVyaSgpLmVxdWFscyhDb21wb3NpdGVSZWZhY3RvcmluZ0ltcGwubnNVcmkpKSB7DQorCQkJCXR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDcpOyAvLygzKSA/Pz8NCisJCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8yMDA3KTsNCisJCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0KTsNCisJCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDQ5KTsNCisJCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4KTsNCisJCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc0KTsNCisJCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc3KTsNCisJCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc4KTsNCisNCisJCQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KHJlZi5nZXROYW1lKCksDQorCQkJCQkJcmVmLmdldE5hbWUoKSwgdHlwZXMpOw0KKwkJCQllbnRyeS5zZXRVbml0SWQocmVmLmdldFJlZklkKCkpOw0KKwkJCQllbnRyeS5zZXRJZChyZWYuZ2V0UmVmSWQoKSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJZW50cnkuc2V0U21hbGxJY29uKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMNCisJCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8yMDA3KSk7DQorCQkJCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7DQorCQkJCWVyZy5hZGQoZW50cnkpOw0KKwkJCX0NCisJCX0NCisNCisJCXJldHVybiBlcmc7DQorCX0NCisNCisJLyoqDQorCSAqIEVyc3RlbGx0IGFsbGUgbvZ0aWdlbiBUb29sZWludHLkZ2UgZvxyIGFsbGUgdmVyZvxnYmFyZW4gRmlsdGVyVW5pdHMNCisJICogDQorCSAqIEByZXR1cm4NCisJICovDQorCXByaXZhdGUgRUxpc3Q8VG9vbEVudHJ5PiBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0cygpIHsNCisJCUVMaXN0PFRvb2xFbnRyeT4gZXJnID0gbmV3IEJhc2ljRUxpc3Q8VG9vbEVudHJ5PigpOw0KKw0KKwkJU2V0PFNpbmdsZUZpbHRlckhlbHBlcj4gaGVscGVyID0gUmVnaXN0cnlVdGlsDQorCQkJCS5sb2FkU2luZ2xlRmlsdGVySGVscGVyKENvbXBvc2l0ZVJlZmFjdG9yaW5nSW1wbC5uc1VyaSk7DQorCQlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXM7DQorCQlOb2RlVG9vbEVudHJ5IGVudHJ5Ow0KKwkJZm9yIChTaW5nbGVGaWx0ZXJIZWxwZXIgZmlsdGVyIDogaGVscGVyKSB7DQorCQkJdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNSk7IC8vKDEpPz8/DQorCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNDApOw0KKwkJCXR5cGVzLmFkZChjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Mik7DQorCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDU3KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMpOw0KKw0KKwkJCWVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoZmlsdGVyLmdldE5hbWUoKSwgZmlsdGVyLmdldE5hbWUoKSwgdHlwZXMpOw0KKwkJCWVudHJ5LnNldFVuaXRJZChmaWx0ZXIuZ2V0SGVscGVySWQoKSk7DQorCQkJZW50cnkuc2V0SWQoZmlsdGVyLmdldEhlbHBlcklkKCkpOyAvLyROT04tTkxTLTEkDQorCQkJZW50cnkuc2V0U21hbGxJY29uKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMNCisJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwMTYpKTsNCisJCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJCWVyZy5hZGQoZW50cnkpOw0KKw0KKwkJfQ0KKw0KKwkJcmV0dXJuIGVyZzsNCisJfQ0KKw0KKwkvKioNCisJICogRXJzdGVsbHQgYWxsZSBu9nRpZ2VuIFRvb2xlaW50cuRnZSBm/HIgYWxsZSB2ZXJm/GdiYXJlbiBGaWx0ZXJVbml0cw0KKwkgKiANCisJICogQHJldHVybg0KKwkgKi8NCisJcHJpdmF0ZSBFTGlzdDxUb29sRW50cnk+IGNyZWF0ZU11bHRpRmlsdGVyVW5pdHMoKSB7DQorCQlFTGlzdDxUb29sRW50cnk+IGVyZyA9IG5ldyBCYXNpY0VMaXN0PFRvb2xFbnRyeT4oKTsNCisNCisJCVNldDxNdWx0aUZpbHRlckhlbHBlcj4gaGVscGVyID0gUmVnaXN0cnlVdGlsDQorCQkJCS5sb2FkTXVsdGlGaWx0ZXJIZWxwZXIoQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsLm5zVXJpKTsNCisJCUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlczsNCisJCU5vZGVUb29sRW50cnkgZW50cnk7DQorCQlmb3IgKE11bHRpRmlsdGVySGVscGVyIGZpbHRlciA6IGhlbHBlcikgew0KKwkJCXR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDUpOyAvLygxKT8/Pw0KKwkJCXR5cGVzLmFkZChjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA0MSk7DQorCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTMpOw0KKwkJCXR5cGVzLmFkZChjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDU4KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA2NCk7DQorDQorCQkJZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeShmaWx0ZXIuZ2V0TmFtZSgpLCBmaWx0ZXIuZ2V0TmFtZSgpLCB0eXBlcyk7DQorCQkJZW50cnkuc2V0VW5pdElkKGZpbHRlci5nZXRIZWxwZXJJZCgpKTsNCisJCQllbnRyeS5zZXRJZChmaWx0ZXIuZ2V0SGVscGVySWQoKSk7IC8vJE5PTi1OTFMtMSQNCisJCQllbnRyeS5zZXRTbWFsbEljb24oY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcw0KKwkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5KSk7DQorCQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCQllcmcuYWRkKGVudHJ5KTsNCisNCisJCX0NCisNCisJCXJldHVybiBlcmc7DQorCX0NCisNCisJLyoqDQorCSAqIEVyc3RlbGx0IGFsbGUgbvZ0aWdlbiBUb29sZWludHLkZ2UgZvxyIGFsbGUgdmVyZvxnYmFyZW4NCisJICogU2luZ2xlRmVhdHVyZVVuaXRzDQorCSAqIA0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwcml2YXRlIEVMaXN0PFRvb2xFbnRyeT4gY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXRzKCkgew0KKwkJRUxpc3Q8VG9vbEVudHJ5PiBlcmcgPSBuZXcgQmFzaWNFTGlzdDxUb29sRW50cnk+KCk7DQorCQlTZXQ8U2luZ2xlRmVhdHVyZUhlbHBlcj4gaGVscGVyID0gUmVnaXN0cnlVdGlsDQorCQkJCS5sb2FkU2luZ2xlRmVhdHVyZUhlbHBlcihDb21wb3NpdGVSZWZhY3RvcmluZ0ltcGwubnNVcmkpOw0KKwkJTGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzOw0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeTsNCisNCisJCWZvciAoU2luZ2xlRmVhdHVyZUhlbHBlciBzaW5nbGVGZWF0dXJlIDogaGVscGVyKSB7DQorCQkJdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNSk7IC8vICgxKSA/Pz8NCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDA4KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDM4KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwKTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDU1KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDYxKTsNCisNCisJCQllbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KHNpbmdsZUZlYXR1cmUuZ2V0TmFtZSgpLA0KKwkJCQkJc2luZ2xlRmVhdHVyZS5nZXROYW1lKCksIHR5cGVzKTsNCisJCQllbnRyeS5zZXRVbml0SWQoc2luZ2xlRmVhdHVyZS5nZXRIZWxwZXJJZCgpKTsNCisJCQllbnRyeS5zZXRJZChzaW5nbGVGZWF0dXJlLmdldEhlbHBlcklkKCkpOyAvLyROT04tTkxTLTEkDQorCQkJZW50cnkuc2V0U21hbGxJY29uKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMNCisJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDA4KSk7DQorCQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCQllcmcuYWRkKGVudHJ5KTsNCisNCisJCX0NCisNCisJCXJldHVybiBlcmc7DQorCX0NCisNCisJLyoqDQorCSAqIEVyc3RlbGx0IGFsbGUgbvZ0aWdlbiBUb29sZWludHLkZ2UgZvxyIGFsbGUgdmVyZvxnYmFyZW4gTXVsdGlGZWF0dXJlVW5pdHMNCisJICogDQorCSAqIEByZXR1cm4NCisJICovDQorCXByaXZhdGUgRUxpc3Q8VG9vbEVudHJ5PiBjcmVhdGVNdWx0aUZlYXR1cmVVbml0cygpIHsNCisJCUVMaXN0PFRvb2xFbnRyeT4gZXJnID0gbmV3IEJhc2ljRUxpc3Q8VG9vbEVudHJ5PigpOw0KKwkJU2V0PE11bHRpRmVhdHVyZUhlbHBlcj4gaGVscGVyID0gUmVnaXN0cnlVdGlsDQorCQkJCS5sb2FkTXVsdGlGZWF0dXJlSGVscGVyKENvbXBvc2l0ZVJlZmFjdG9yaW5nSW1wbC5uc1VyaSk7DQorCQlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXM7DQorCQlOb2RlVG9vbEVudHJ5IGVudHJ5Ow0KKw0KKwkJZm9yIChNdWx0aUZlYXR1cmVIZWxwZXIgbXVsdGlGZWF0dXJlIDogaGVscGVyKSB7DQorDQorCQkJdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNSk7IC8vKDEpID8/Pw0KKwkJCXR5cGVzLmFkZChjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAxMik7DQorCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5KTsNCisJCQl0eXBlcy5hZGQoY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTEpOw0KKwkJCXR5cGVzLmFkZChjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1Nik7DQorCQkJdHlwZXMuYWRkKGNvbXJlbC5kaWFncmFtLnByb3ZpZGVycy5Db21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyKTsNCisNCisJCQllbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KG11bHRpRmVhdHVyZS5nZXROYW1lKCksDQorCQkJCQltdWx0aUZlYXR1cmUuZ2V0TmFtZSgpLCB0eXBlcyk7DQorCQkJZW50cnkuc2V0VW5pdElkKG11bHRpRmVhdHVyZS5nZXRIZWxwZXJJZCgpKTsNCisJCQllbnRyeS5zZXRJZChtdWx0aUZlYXR1cmUuZ2V0SGVscGVySWQoKSk7IC8vJE5PTi1OTFMtMSQNCisJCQllbnRyeS5zZXRTbWFsbEljb24oY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbEVsZW1lbnRUeXBlcw0KKwkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAxMikpOw0KKwkJCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7DQorCQkJZXJnLmFkZChlbnRyeSk7DQorDQorCQl9DQorDQorCQlyZXR1cm4gZXJnOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzICJDb21wb3NpdGUgVW5pdHMiIHBhbGV0dGUgdG9vbCBncm91cA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQ29tcG9zaXRlVW5pdHMxR3JvdXAoKSB7DQorCQlQYWxldHRlRHJhd2VyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigNCisJCQkJTWVzc2FnZXMuQ29tcG9zaXRlVW5pdHMxR3JvdXBfdGl0bGUpOw0KKwkJcGFsZXR0ZUNvbnRhaW5lci5zZXRJZCgiY3JlYXRlQ29tcG9zaXRlVW5pdHMxR3JvdXAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdDFDcmVhdGlvblRvb2woKSk7DQorCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVDb25kaXRpb25DaGVjazJDcmVhdGlvblRvb2woKSk7DQorCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVDb25kaXRpb25hbFVuaXQzQ3JlYXRpb25Ub29sKCkpOw0KKwkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0aW9uVG9vbCgpKTsNCisJCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVNlcXVlbnRpYWxVbml0NUNyZWF0aW9uVG9vbCgpKTsNCisJCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRpb25Ub29sKCkpOw0KKwkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgIkF0b21pYyBVbml0cyIgcGFsZXR0ZSB0b29sIGdyb3VwDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQXRvbWljVW5pdHMyR3JvdXAoKSB7DQorCQlQYWxldHRlRHJhd2VyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigNCisJCQkJTWVzc2FnZXMuQXRvbWljVW5pdHMyR3JvdXBfdGl0bGUpOw0KKwkJcGFsZXR0ZUNvbnRhaW5lci5zZXRJZCgiY3JlYXRlQXRvbWljVW5pdHMyR3JvdXAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJcGFsZXR0ZUNvbnRhaW5lci5hZGRBbGwodGhpcy5jcmVhdGVBdG9taWNVbml0cygpKTsNCisJCXJldHVybiBwYWxldHRlQ29udGFpbmVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzICJGaWx0ZXIgVW5pdHMiIHBhbGV0dGUgdG9vbCBncm91cA0KKwkgKiBAZ2VuZXJhdGVkIE5PVA0KKwkgKi8NCisJcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUZpbHRlclVuaXRzM0dyb3VwKCkgew0KKwkJUGFsZXR0ZURyYXdlciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoDQorCQkJCU1lc3NhZ2VzLkZpbHRlclVuaXRzM0dyb3VwX3RpdGxlKTsNCisJCXBhbGV0dGVDb250YWluZXIuc2V0SWQoImNyZWF0ZUZpbHRlclVuaXRzM0dyb3VwIik7IC8vJE5PTi1OTFMtMSQNCisJCUFycmF5TGlzdDxUb29sRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VG9vbEVudHJ5PigpOw0KKwkJcmVzdWx0LmFkZEFsbChjcmVhdGVTaW5nbGVGaWx0ZXJVbml0cygpKTsNCisJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTXVsdGlGaWx0ZXJVbml0cygpKTsNCisJCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBuZXcgVG9vbEVudHJ5Q29tcGFyYXRvcigpKTsNCisJCXBhbGV0dGVDb250YWluZXIuYWRkQWxsKHJlc3VsdCk7DQorCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyAiRmVhdHVyZSBVbml0cyIgcGFsZXR0ZSB0b29sIGdyb3VwDQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlRmVhdHVyZVVuaXRzNEdyb3VwKCkgew0KKwkJUGFsZXR0ZURyYXdlciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoDQorCQkJCU1lc3NhZ2VzLkZlYXR1cmVVbml0czRHcm91cF90aXRsZSk7DQorCQlwYWxldHRlQ29udGFpbmVyLnNldElkKCJjcmVhdGVGZWF0dXJlVW5pdHM0R3JvdXAiKTsgLy8kTk9OLU5MUy0xJA0KKwkJQXJyYXlMaXN0PFRvb2xFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUb29sRW50cnk+KCk7DQorCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0cygpKTsNCisJCXJlc3VsdC5hZGRBbGwoY3JlYXRlTXVsdGlGZWF0dXJlVW5pdHMoKSk7DQorCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgbmV3IFRvb2xFbnRyeUNvbXBhcmF0b3IoKSk7DQorCQlwYWxldHRlQ29udGFpbmVyLmFkZEFsbChyZXN1bHQpOw0KKwkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgIlBvcnRzIiBwYWxldHRlIHRvb2wgZ3JvdXANCisJICogQGdlbmVyYXRlZCBOT1QNCisJICovDQorCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVQb3J0czVHcm91cCgpIHsNCisJCVBhbGV0dGVEcmF3ZXIgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlRHJhd2VyKA0KKwkJCQlNZXNzYWdlcy5Qb3J0czVHcm91cF90aXRsZSk7DQorCQlwYWxldHRlQ29udGFpbmVyLnNldElkKCJjcmVhdGVQb3J0czVHcm91cCIpOyAvLyROT04tTkxTLTEkDQorCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVNdWx0aUlucHV0UG9ydDFDcmVhdGlvblRvb2woKSk7DQorCQkvLyBwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVNdWx0aU91dHB1dFBvcnQyQ3JlYXRpb25Ub29sKCkpOw0KKwkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlU2luZ2xlSW5wdXRQb3J0M0NyZWF0aW9uVG9vbCgpKTsNCisJCS8vIHBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVNpbmdsZU91dHB1dFBvcnQ0Q3JlYXRpb25Ub29sKCkpOw0KKwkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgIk1hcHBpbmdzIiBwYWxldHRlIHRvb2wgZ3JvdXANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZU1hcHBpbmdzNkdyb3VwKCkgew0KKwkJUGFsZXR0ZURyYXdlciBwYWxldHRlQ29udGFpbmVyID0gbmV3IFBhbGV0dGVEcmF3ZXIoDQorCQkJCU1lc3NhZ2VzLk1hcHBpbmdzNkdyb3VwX3RpdGxlKTsNCisJCXBhbGV0dGVDb250YWluZXIuc2V0SWQoImNyZWF0ZU1hcHBpbmdzNkdyb3VwIik7IC8vJE5PTi1OTFMtMSQNCisJCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZU11bHRpUG9ydE1hcHBpbmcxQ3JlYXRpb25Ub29sKCkpOw0KKwkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTXVsdGlTaW5nbGVQb3J0TWFwcGluZzJDcmVhdGlvblRvb2woKSk7DQorCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVTaW5nbGVQb3J0TWFwcGluZzNDcmVhdGlvblRvb2woKSk7DQorCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdDFDcmVhdGlvblRvb2woKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig3KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8yMDAyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3KTsNCisJCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgNCisJCQkJTWVzc2FnZXMuQ2FydGVzaWFuUXVldWVkVW5pdDFDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLkNhcnRlc2lhblF1ZXVlZFVuaXQxQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsNCisJCWVudHJ5LnNldElkKCJjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0MUNyZWF0aW9uVG9vbCIpOyAvLyROT04tTkxTLTEkDQorCQllbnRyeS5zZXRTbWFsbEljb24oQ29tcmVsRWxlbWVudFR5cGVzDQorCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMikpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQ29uZGl0aW9uQ2hlY2syQ3JlYXRpb25Ub29sKCkgew0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KA0KKwkJCQlNZXNzYWdlcy5Db25kaXRpb25DaGVjazJDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLkNvbmRpdGlvbkNoZWNrMkNyZWF0aW9uVG9vbF9kZXNjLA0KKwkJCQlDb2xsZWN0aW9ucw0KKwkJCQkJCS5zaW5nbGV0b25MaXN0KENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25DaGVja18zMDc2KSk7DQorCQllbnRyeS5zZXRJZCgiY3JlYXRlQ29uZGl0aW9uQ2hlY2syQ3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3NikpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQ29uZGl0aW9uYWxVbml0M0NyZWF0aW9uVG9vbCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDcpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNjYpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzUpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMjAwNik7DQorCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoDQorCQkJCU1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLkNvbmRpdGlvbmFsVW5pdDNDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOw0KKwkJZW50cnkuc2V0SWQoImNyZWF0ZUNvbmRpdGlvbmFsVW5pdDNDcmVhdGlvblRvb2wiKTsgLy8kTk9OLU5MUy0xJA0KKwkJZW50cnkuc2V0U21hbGxJY29uKENvbXJlbEVsZW1lbnRUeXBlcw0KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzAzMCkpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0aW9uVG9vbCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDcpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM2KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0Myk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDgpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMjAwMyk7DQorCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoDQorCQkJCU1lc3NhZ2VzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLlBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOw0KKwkJZW50cnkuc2V0SWQoImNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGlvblRvb2wiKTsgLy8kTk9OLU5MUy0xJA0KKwkJZW50cnkuc2V0U21hbGxJY29uKENvbXJlbEVsZW1lbnRUeXBlcw0KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCkpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlU2VxdWVudGlhbFVuaXQ1Q3JlYXRpb25Ub29sKCkgew0KKwkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNyk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwMjYpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDQ0KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDcwKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3Myk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzIwMDUpOw0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KA0KKwkJCQlNZXNzYWdlcy5TZXF1ZW50aWFsVW5pdDVDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLlNlcXVlbnRpYWxVbml0NUNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7DQorCQllbnRyeS5zZXRJZCgiY3JlYXRlU2VxdWVudGlhbFVuaXQ1Q3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzAyNikpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlU2luZ2xlUXVldWVkVW5pdDZDcmVhdGlvblRvb2woKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig3KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDQyKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDY1KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDY3KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8yMDA0KTsNCisJCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgNCisJCQkJTWVzc2FnZXMuU2luZ2xlUXVldWVkVW5pdDZDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLlNpbmdsZVF1ZXVlZFVuaXQ2Q3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsNCisJCWVudHJ5LnNldElkKCJjcmVhdGVTaW5nbGVRdWV1ZWRVbml0NkNyZWF0aW9uVG9vbCIpOyAvLyROT04tTkxTLTEkDQorCQllbnRyeS5zZXRTbWFsbEljb24oQ29tcmVsRWxlbWVudFR5cGVzDQorCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMikpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQXRvbWljVW5pdDFDcmVhdGlvblRvb2woKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig3KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDQ5KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc0KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc3KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc4KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8yMDA3KTsNCisJCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgNCisJCQkJTWVzc2FnZXMuQXRvbWljVW5pdDFDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLkF0b21pY1VuaXQxQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsNCisJCWVudHJ5LnNldElkKCJjcmVhdGVBdG9taWNVbml0MUNyZWF0aW9uVG9vbCIpOyAvLyROT04tTkxTLTEkDQorCQllbnRyeS5zZXRTbWFsbEljb24oQ29tcmVsRWxlbWVudFR5cGVzDQorCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzAzNCkpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlTXVsdGlGaWx0ZXJVbml0MUNyZWF0aW9uVG9vbCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDUpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDQxKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTMpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDY0KTsNCisJCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgNCisJCQkJTWVzc2FnZXMuTXVsdGlGaWx0ZXJVbml0MUNyZWF0aW9uVG9vbF90aXRsZSwNCisJCQkJTWVzc2FnZXMuTXVsdGlGaWx0ZXJVbml0MUNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7DQorCQllbnRyeS5zZXRJZCgiY3JlYXRlTXVsdGlGaWx0ZXJVbml0MUNyZWF0aW9uVG9vbCIpOyAvLyROT04tTkxTLTEkDQorCQllbnRyeS5zZXRTbWFsbEljb24oQ29tcmVsRWxlbWVudFR5cGVzDQorCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5KSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0MkNyZWF0aW9uVG9vbCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDUpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwMTYpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNDApOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMpOw0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KA0KKwkJCQlNZXNzYWdlcy5TaW5nbGVGaWx0ZXJVbml0MkNyZWF0aW9uVG9vbF90aXRsZSwNCisJCQkJTWVzc2FnZXMuU2luZ2xlRmlsdGVyVW5pdDJDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOw0KKwkJZW50cnkuc2V0SWQoImNyZWF0ZVNpbmdsZUZpbHRlclVuaXQyQ3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2KSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVNdWx0aUZlYXR1cmVVbml0MUNyZWF0aW9uVG9vbCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDUpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMTIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMzkpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTEpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNjIpOw0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KA0KKwkJCQlNZXNzYWdlcy5NdWx0aUZlYXR1cmVVbml0MUNyZWF0aW9uVG9vbF90aXRsZSwNCisJCQkJTWVzc2FnZXMuTXVsdGlGZWF0dXJlVW5pdDFDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOw0KKwkJZW50cnkuc2V0SWQoImNyZWF0ZU11bHRpRmVhdHVyZVVuaXQxQ3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyKSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdDJDcmVhdGlvblRvb2woKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig1KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzgpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDUwKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEpOw0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KA0KKwkJCQlNZXNzYWdlcy5TaW5nbGVGZWF0dXJlVW5pdDJDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLlNpbmdsZUZlYXR1cmVVbml0MkNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7DQorCQllbnRyeS5zZXRJZCgiY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQyQ3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCkpOw0KKwkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsNCisJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlTXVsdGlJbnB1dFBvcnQxQ3JlYXRpb25Ub29sKCkgew0KKwkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oOSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE3KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoDQorCQkJCU1lc3NhZ2VzLk11bHRpSW5wdXRQb3J0MUNyZWF0aW9uVG9vbF90aXRsZSwNCisJCQkJTWVzc2FnZXMuTXVsdGlJbnB1dFBvcnQxQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsNCisJCWVudHJ5LnNldElkKCJjcmVhdGVNdWx0aUlucHV0UG9ydDFDcmVhdGlvblRvb2wiKTsgLy8kTk9OLU5MUy0xJA0KKwkJZW50cnkuc2V0U21hbGxJY29uKENvbXJlbEVsZW1lbnRUeXBlcw0KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVNdWx0aU91dHB1dFBvcnQyQ3JlYXRpb25Ub29sKCkgew0KKwkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KA0KKwkJCQlNZXNzYWdlcy5NdWx0aU91dHB1dFBvcnQyQ3JlYXRpb25Ub29sX3RpdGxlLA0KKwkJCQlNZXNzYWdlcy5NdWx0aU91dHB1dFBvcnQyQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsNCisJCWVudHJ5LnNldElkKCJjcmVhdGVNdWx0aU91dHB1dFBvcnQyQ3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUpKTsNCisJCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7DQorCQlyZXR1cm4gZW50cnk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVNpbmdsZUlucHV0UG9ydDNDcmVhdGlvblRvb2woKSB7DQorCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig5KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwMSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAxMyk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjcpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgNCisJCQkJTWVzc2FnZXMuU2luZ2xlSW5wdXRQb3J0M0NyZWF0aW9uVG9vbF90aXRsZSwNCisJCQkJTWVzc2FnZXMuU2luZ2xlSW5wdXRQb3J0M0NyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7DQorCQllbnRyeS5zZXRJZCgiY3JlYXRlU2luZ2xlSW5wdXRQb3J0M0NyZWF0aW9uVG9vbCIpOyAvLyROT04tTkxTLTEkDQorCQllbnRyeS5zZXRTbWFsbEljb24oQ29tcmVsRWxlbWVudFR5cGVzDQorCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8yMDAxKSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVTaW5nbGVPdXRwdXRQb3J0NENyZWF0aW9uVG9vbCgpIHsNCisJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTEpOw0KKwkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTgpOw0KKwkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KA0KKwkJCQlNZXNzYWdlcy5TaW5nbGVPdXRwdXRQb3J0NENyZWF0aW9uVG9vbF90aXRsZSwNCisJCQkJTWVzc2FnZXMuU2luZ2xlT3V0cHV0UG9ydDRDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOw0KKwkJZW50cnkuc2V0SWQoImNyZWF0ZVNpbmdsZU91dHB1dFBvcnQ0Q3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDExKSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVNdWx0aVBvcnRNYXBwaW5nMUNyZWF0aW9uVG9vbCgpIHsNCisJCUxpbmtUb29sRW50cnkgZW50cnkgPSBuZXcgTGlua1Rvb2xFbnRyeSgNCisJCQkJTWVzc2FnZXMuTXVsdGlQb3J0TWFwcGluZzFDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLk11bHRpUG9ydE1hcHBpbmcxQ3JlYXRpb25Ub29sX2Rlc2MsDQorCQkJCUNvbGxlY3Rpb25zDQorCQkJCQkJLnNpbmdsZXRvbkxpc3QoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpUG9ydE1hcHBpbmdfNDAwMikpOw0KKwkJZW50cnkuc2V0SWQoImNyZWF0ZU11bHRpUG9ydE1hcHBpbmcxQ3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlQb3J0TWFwcGluZ180MDAyKSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVNdWx0aVNpbmdsZVBvcnRNYXBwaW5nMkNyZWF0aW9uVG9vbCgpIHsNCisJCUxpbmtUb29sRW50cnkgZW50cnkgPSBuZXcgTGlua1Rvb2xFbnRyeSgNCisJCQkJTWVzc2FnZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZzJDcmVhdGlvblRvb2xfdGl0bGUsDQorCQkJCU1lc3NhZ2VzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmcyQ3JlYXRpb25Ub29sX2Rlc2MsDQorCQkJCUNvbGxlY3Rpb25zDQorCQkJCQkJLnNpbmdsZXRvbkxpc3QoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwMykpOw0KKwkJZW50cnkuc2V0SWQoImNyZWF0ZU11bHRpU2luZ2xlUG9ydE1hcHBpbmcyQ3JlYXRpb25Ub29sIik7IC8vJE5PTi1OTFMtMSQNCisJCWVudHJ5LnNldFNtYWxsSWNvbihDb21yZWxFbGVtZW50VHlwZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzKSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVTaW5nbGVQb3J0TWFwcGluZzNDcmVhdGlvblRvb2woKSB7DQorCQlMaW5rVG9vbEVudHJ5IGVudHJ5ID0gbmV3IExpbmtUb29sRW50cnkoDQorCQkJCU1lc3NhZ2VzLlNpbmdsZVBvcnRNYXBwaW5nM0NyZWF0aW9uVG9vbF90aXRsZSwNCisJCQkJTWVzc2FnZXMuU2luZ2xlUG9ydE1hcHBpbmczQ3JlYXRpb25Ub29sX2Rlc2MsDQorCQkJCUNvbGxlY3Rpb25zDQorCQkJCQkJLnNpbmdsZXRvbkxpc3QoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEpKTsNCisJCWVudHJ5LnNldElkKCJjcmVhdGVTaW5nbGVQb3J0TWFwcGluZzNDcmVhdGlvblRvb2wiKTsgLy8kTk9OLU5MUy0xJA0KKwkJZW50cnkuc2V0U21hbGxJY29uKENvbXJlbEVsZW1lbnRUeXBlcw0KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVQb3J0TWFwcGluZ180MDAxKSk7DQorCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOw0KKwkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsNCisNCisJCVN0cmluZyB1bml0SWQgPSAiIjsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIGZpbmFsIExpc3Q8SUVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXM7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBOb2RlVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLA0KKwkJCQlMaXN0PElFbGVtZW50VHlwZT4gZWxlbWVudFR5cGVzKSB7DQorCQkJc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBudWxsLCBudWxsKTsNCisJCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZCBOT1QNCisJCSAqLw0KKwkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsNCisJCQkvKg0KKwkJCSAqIGNoYW5nZTogVW5zcGVjaWZpZWRUeXBlQ1JlYXRlaW9uVG9vbCAtPg0KKwkJCSAqIFVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbFdpdGhVbml0SWQNCisJCQkgKi8NCisJCQlVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2xXaXRoVW5pdElkKA0KKwkJCQkJZWxlbWVudFR5cGVzLCB1bml0SWQpOw0KKwkJCU1hcCBwcm9wID0gZ2V0VG9vbFByb3BlcnRpZXMoKTsNCisJCQl0b29sLnNldFByb3BlcnRpZXMocHJvcCk7DQorCQkJcmV0dXJuIHRvb2w7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBzZXRVbml0SWQoU3RyaW5nIHVuaXRJZCkgew0KKwkJCXRoaXMudW5pdElkID0gdW5pdElkOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW5rVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIGZpbmFsIExpc3Q8SUVsZW1lbnRUeXBlPiByZWxhdGlvbnNoaXBUeXBlczsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIExpbmtUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sDQorCQkJCUxpc3Q8SUVsZW1lbnRUeXBlPiByZWxhdGlvbnNoaXBUeXBlcykgew0KKwkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7DQorCQkJdGhpcy5yZWxhdGlvbnNoaXBUeXBlcyA9IHJlbGF0aW9uc2hpcFR5cGVzOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7DQorCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sKHJlbGF0aW9uc2hpcFR5cGVzKTsNCisJCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7DQorCQkJcmV0dXJuIHRvb2w7DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbFNob3J0Y3V0UHJvcGVydHlUZXN0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxTaG9ydGN1dFByb3BlcnR5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjOGMzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxTaG9ydGN1dFByb3BlcnR5VGVzdGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsU2hvcnRjdXRQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUQ1VUX1BST1BFUlRZID0gImlzU2hvcnRjdXQiOyAvLyROT04tTkxTLTEkDQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncywNCisJCQlPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgew0KKwkJaWYgKGZhbHNlID09IHJlY2VpdmVyIGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCVZpZXcgdmlldyA9IChWaWV3KSByZWNlaXZlcjsNCisJCWlmIChTSE9SVENVVF9QUk9QRVJUWS5lcXVhbHMobWV0aG9kKSkgew0KKwkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoYW5ub3RhdGlvbg0KKwkJCQkJCS5nZXREZXRhaWxzKCkuZ2V0KCJtb2RlbElEIikpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxVcmlFZGl0b3JJbnB1dFRlc3Rlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0NvbXJlbFVyaUVkaXRvcklucHV0VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiOTQ2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxVcmlFZGl0b3JJbnB1dFRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsVXJpRWRpdG9ySW5wdXRUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncywNCisJCQlPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgew0KKwkJaWYgKGZhbHNlID09IHJlY2VpdmVyIGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlVUklFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChVUklFZGl0b3JJbnB1dCkgcmVjZWl2ZXI7DQorCQlyZXR1cm4gImNvbXJlbF9kaWFncmFtIi5lcXVhbHMoZWRpdG9ySW5wdXQuZ2V0VVJJKCkuZmlsZUV4dGVuc2lvbigpKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTg3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsNTA1OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy4qOw0KKw0KKy8qKg0KKyAqIFRoaXMgcmVnaXN0cnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZSBvZiB2aXN1YWwgb2JqZWN0IHNob3VsZCBiZQ0KKyAqIGNyZWF0ZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIERpYWdyYW0sIE5vZGUsIENoaWxkTm9kZSBvciBMaW5rIHJlcHJlc2VudGVkDQorICogYnkgYSBkb21haW4gbW9kZWwgb2JqZWN0Lg0KKyAqIA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsVmlzdWFsSURSZWdpc3RyeSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfS0VZID0gImNvbXJlbC5kaWFncmFtL2RlYnVnL3Zpc3VhbElEIjsgLy8kTk9OLU5MUy0xJA0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoVmlldyB2aWV3KSB7DQorCQlpZiAodmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsNCisJCQlpZiAoQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHModmlldy5nZXRUeXBlKCkpKSB7DQorCQkJCXJldHVybiBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9IGVsc2Ugew0KKwkJCQlyZXR1cm4gLTE7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3DQorCQkJCS5nZXRUeXBlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2RlbElEKFZpZXcgdmlldykgew0KKwkJVmlldyBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7DQorCQl3aGlsZSAodmlldyAhPSBkaWFncmFtKSB7DQorCQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7DQorCQkJCXJldHVybiAoU3RyaW5nKSBhbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoIm1vZGVsSUQiKTsgLy8kTk9OLU5MUy0xJA0KKwkJCX0NCisJCQl2aWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGRpYWdyYW0uZ2V0VHlwZSgpIDogbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoU3RyaW5nIHR5cGUpIHsNCisJCXRyeSB7DQorCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodHlwZSk7DQorCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKwkJCWlmIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKA0KKwkJCQkJUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oREVCVUdfS0VZKSkpIHsNCisJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJCSJVbmFibGUgdG8gcGFyc2UgdmlldyB0eXBlIGFzIGEgdmlzdWFsSUQgbnVtYmVyOiAiDQorCQkJCQkJCQkrIHR5cGUpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShpbnQgdmlzdWFsSUQpIHsNCisJCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZpc3VhbElEKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgew0KKwkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgew0KKwkJCXJldHVybiAtMTsNCisJCX0NCisJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSZWZhY3RvcmluZygpLmlzU3VwZXJUeXBlT2YoDQorCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpDQorCQkJCSYmIGlzRGlhZ3JhbSgoQ29tcG9zaXRlUmVmYWN0b3JpbmcpIGRvbWFpbkVsZW1lbnQpKSB7DQorCQkJcmV0dXJuIENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJfQ0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGludCBnZXROb2RlVmlzdWFsSUQoVmlldyBjb250YWluZXJWaWV3LCBFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsNCisJCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsNCisJCQlyZXR1cm4gLTE7DQorCQl9DQorCQlTdHJpbmcgY29udGFpbmVyTW9kZWxJRCA9IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsNCisJCWlmICghQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkNCisJCQkJJiYgISJjb21yZWwiLmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgeyAvLyROT04tTkxTLTEkDQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKwkJaW50IGNvbnRhaW5lclZpc3VhbElEOw0KKwkJaWYgKENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7DQorCQkJY29udGFpbmVyVmlzdWFsSUQgPSBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCS5nZXRWaXN1YWxJRChjb250YWluZXJWaWV3KTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKGNvbnRhaW5lclZpZXcgaW5zdGFuY2VvZiBEaWFncmFtKSB7DQorCQkJCWNvbnRhaW5lclZpc3VhbElEID0gQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfSBlbHNlIHsNCisJCQkJcmV0dXJuIC0xOw0KKwkJCX0NCisJCX0NCisJCXN3aXRjaCAoY29udGFpbmVyVmlzdWFsSUQpIHsNCisJCWNhc2UgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlT3V0cHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVPdXRwdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpT3V0cHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpT3V0cHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVPdXRwdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpT3V0cHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVPdXRwdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpT3V0cHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVPdXRwdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpT3V0cHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVPdXRwdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aU91dHB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25DaGVjaygpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbkNoZWNrKCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25DaGVjaygpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uQ2hlY2soKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uQ2hlY2soKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uQ2hlY2soKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25DaGVjaygpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpLmlzU3VwZXJUeXBlT2YoDQorCQkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQkJZG9tYWluRWxlbWVudC5lQ2xhc3MoKSkpIHsNCisJCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ7DQorCQkJfQ0KKwkJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkuaXNTdXBlclR5cGVPZigNCisJCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJCXJldHVybiBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDsNCisJCQl9DQorCQkJYnJlYWs7DQorCQl9DQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5DcmVhdGVOb2RlKFZpZXcgY29udGFpbmVyVmlldywgaW50IG5vZGVWaXN1YWxJRCkgew0KKwkJU3RyaW5nIGNvbnRhaW5lck1vZGVsSUQgPSBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldyk7DQorCQlpZiAoIUNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpDQorCQkJCSYmICEiY29tcmVsIi5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsgLy8kTk9OLU5MUy0xJA0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCWludCBjb250YWluZXJWaXN1YWxJRDsNCisJCWlmIChDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgew0KKwkJCWNvbnRhaW5lclZpc3VhbElEID0gY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkuZ2V0VmlzdWFsSUQoY29udGFpbmVyVmlldyk7DQorCQl9IGVsc2Ugew0KKwkJCWlmIChjb250YWluZXJWaWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgew0KKwkJCQljb250YWluZXJWaXN1YWxJRCA9IENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJCX0gZWxzZSB7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQl9DQorCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7DQorCQljYXNlIENvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQXRvbWljVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQXRvbWljVW5pdExhYmVsVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZU91dHB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aU91dHB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQXRvbWljVW5pdExhYmVsVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKEF0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChBdG9taWNVbml0TGFiZWxUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQXRvbWljVW5pdExhYmVsVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb25kaXRpb25DaGVja05hbWVUeXBlU3BlY0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQXRvbWljVW5pdExhYmVsVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQXRvbWljVW5pdExhYmVsVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQ29uZGl0aW9uYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChBdG9taWNVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlpZiAoU2luZ2xlRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoTXVsdGlGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCWlmIChDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsNCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCWlmIChDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJaWYgKENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJaWYgKENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlpZiAoQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7DQorCQkJCXJldHVybiB0cnVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgew0KKwkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgew0KKwkJCXJldHVybiAtMTsNCisJCX0NCisJCWlmIChDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVQb3J0TWFwcGluZygpLmlzU3VwZXJUeXBlT2YoDQorCQkJCWRvbWFpbkVsZW1lbnQuZUNsYXNzKCkpKSB7DQorCQkJcmV0dXJuIFNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJfQ0KKwkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpUG9ydE1hcHBpbmcoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCXJldHVybiBNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJfQ0KKwkJaWYgKENvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmcoKS5pc1N1cGVyVHlwZU9mKA0KKwkJCQlkb21haW5FbGVtZW50LmVDbGFzcygpKSkgew0KKwkJCXJldHVybiBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOw0KKwkJfQ0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCS8qKg0KKwkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMNCisJICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLg0KKwkgKiANCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpYWdyYW0oQ29tcG9zaXRlUmVmYWN0b3JpbmcgZWxlbWVudCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0RlbGV0ZUVsZW1lbnRBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9EZWxldGVFbGVtZW50QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0Y2M0OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9EZWxldGVFbGVtZW50QWN0aW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFic3RyYWN0RGVsZXRlRnJvbUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1VSU1lc3NhZ2VzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBEZWxldGVFbGVtZW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3REZWxldGVGcm9tQWN0aW9uIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBEZWxldGVFbGVtZW50QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsNCisJCXN1cGVyKHBhcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRGVsZXRlRWxlbWVudEFjdGlvbihJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlKSB7DQorCQlzdXBlcih3b3JrYmVuY2hQYWdlKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdCgpIHsNCisJCXN1cGVyLmluaXQoKTsNCisJCXNldElkKEFjdGlvbklkcy5BQ1RJT05fREVMRVRFX0ZST01fTU9ERUwpOw0KKwkJc2V0VGV4dChEaWFncmFtVUlNZXNzYWdlcy5EaWFncmFtRWRpdG9yX0RlbGV0ZV9mcm9tX01vZGVsKTsNCisJCXNldFRvb2xUaXBUZXh0KERpYWdyYW1VSU1lc3NhZ2VzLkRpYWdyYW1FZGl0b3JfRGVsZXRlX2Zyb21fTW9kZWxUb29sVGlwKTsNCisJCUlTaGFyZWRJbWFnZXMgd29ya2JlbmNoSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KKwkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCk7DQorCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcih3b3JrYmVuY2hJbWFnZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOw0KKwkJc2V0SW1hZ2VEZXNjcmlwdG9yKHdvcmtiZW5jaEltYWdlcw0KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfREVMRVRFKSk7DQorCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcih3b3JrYmVuY2hJbWFnZXMNCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURV9ESVNBQkxFRCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1hbmRMYWJlbCgpIHsNCisJCXJldHVybiBEaWFncmFtVUlNZXNzYWdlcy5EaWFncmFtRWRpdG9yX0RlbGV0ZV9mcm9tX01vZGVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgew0KKwkJTGlzdCBvcGVyYXRpb25TZXQgPSBnZXRPcGVyYXRpb25TZXQoKTsNCisJCWlmIChvcGVyYXRpb25TZXQuaXNFbXB0eSgpKSB7DQorCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7DQorCQl9DQorCQlJdGVyYXRvciBlZGl0UGFydHMgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsNCisJCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoDQorCQkJCWdldEVkaXRpbmdEb21haW4oKSwgZ2V0Q29tbWFuZExhYmVsKCkpOw0KKwkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsNCisJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLm5leHQoKTsNCisJCQlDb21tYW5kIGN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOw0KKwkJCWlmIChjdXJDb21tYW5kICE9IG51bGwpIHsNCisJCQkJY29tbWFuZC5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoY3VyQ29tbWFuZCkpOw0KKwkJCX0NCisJCX0NCisJCWlmIChjb21tYW5kLmlzRW1wdHkoKSB8fCBjb21tYW5kLnNpemUoKSAhPSBvcGVyYXRpb25TZXQuc2l6ZSgpKSB7DQorCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7DQorCQl9DQorCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0RpYWdyYW1FZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvRGlhZ3JhbUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzI2NzZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0RpYWdyYW1FZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25pdGVtLkNvbnRyaWJ1dGlvbkl0ZW1TZXJ2aWNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzDQorCQlEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IHBhcnQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIERlbGV0ZUVsZW1lbnRBY3Rpb24gZGVsZXRlQWN0aW9uOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdyYW1FZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyKElXb3JrYmVuY2hQYXJ0IHBhcnQsDQorCQkJRWRpdFBhcnRWaWV3ZXIgdmlld2VyKSB7DQorCQlzdXBlcihwYXJ0LCB2aWV3ZXIpOw0KKwkJdGhpcy5wYXJ0ID0gcGFydDsNCisJCWRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVFbGVtZW50QWN0aW9uKHBhcnQpOw0KKwkJZGVsZXRlQWN0aW9uLmluaXQoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCisJCWlmIChkZWxldGVBY3Rpb24gIT0gbnVsbCkgew0KKwkJCWRlbGV0ZUFjdGlvbi5kaXNwb3NlKCk7DQorCQkJZGVsZXRlQWN0aW9uID0gbnVsbDsNCisJCX0NCisJCXN1cGVyLmRpc3Bvc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYnVpbGRDb250ZXh0TWVudShmaW5hbCBJTWVudU1hbmFnZXIgbWVudSkgew0KKwkJZ2V0Vmlld2VyKCkuZmx1c2goKTsNCisJCXRyeSB7DQorCQkJVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oDQorCQkJCQkoRU9iamVjdCkgZ2V0Vmlld2VyKCkuZ2V0Q29udGVudHMoKS5nZXRNb2RlbCgpKQ0KKwkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7DQorDQorCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQlDb250cmlidXRpb25JdGVtU2VydmljZQ0KKwkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpDQorCQkJCQkJCQkJLmNvbnRyaWJ1dGVUb1BvcHVwTWVudSgNCisJCQkJCQkJCQkJCURpYWdyYW1FZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyLnRoaXMsDQorCQkJCQkJCQkJCQlwYXJ0KTsNCisJCQkJCQkJbWVudS5yZW1vdmUoQWN0aW9uSWRzLkFDVElPTl9ERUxFVEVfRlJPTV9NT0RFTCk7DQorCQkJCQkJCW1lbnUuYXBwZW5kVG9Hcm91cCgiZWRpdEdyb3VwIiwgZGVsZXRlQWN0aW9uKTsNCisJCQkJCQl9DQorCQkJCQl9KTsNCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIkVycm9yIGJ1aWxkaW5nIGNvbnRleHQgbWVudSIsIGUpOw0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWNkMzgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L0xvYWRSZXNvdXJjZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTG9hZFJlc291cmNlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQorCQlJRWRpdG9yUGFydCBkaWFncmFtRWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yQ2hlY2tlZChldmVudCk7DQorCQlTaGVsbCBzaGVsbCA9IGRpYWdyYW1FZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCk7DQorCQlhc3NlcnQgZGlhZ3JhbUVkaXRvciBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3I7DQorCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChEaWFncmFtRWRpdG9yKSBkaWFncmFtRWRpdG9yKQ0KKwkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOw0KKwkJb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbi5Mb2FkUmVzb3VyY2VEaWFsb2cgbG9hZFJlc291cmNlRGlhbG9nID0gbmV3IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb24uTG9hZFJlc291cmNlRGlhbG9nKA0KKwkJCQlzaGVsbCwgZWRpdGluZ0RvbWFpbik7DQorCQlsb2FkUmVzb3VyY2VEaWFsb2cub3BlbigpOw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L01lc3NhZ2VzLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc1MDY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwxMTUyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyB7DQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJtZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJA0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIE1lc3NhZ2VzKCkgew0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxDcmVhdGlvbldpemFyZFRpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsQ3JlYXRpb25XaXphcmRfRGlhZ3JhbU1vZGVsRmlsZVBhZ2VUaXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbENyZWF0aW9uV2l6YXJkX0RpYWdyYW1Nb2RlbEZpbGVQYWdlRGVzY3JpcHRpb247DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxDcmVhdGlvbldpemFyZF9Eb21haW5Nb2RlbEZpbGVQYWdlVGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxDcmVhdGlvbldpemFyZF9Eb21haW5Nb2RlbEZpbGVQYWdlRGVzY3JpcHRpb247DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxDcmVhdGlvbldpemFyZE9wZW5FZGl0b3JFcnJvcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbENyZWF0aW9uV2l6YXJkQ3JlYXRpb25FcnJvcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbENyZWF0aW9uV2l6YXJkUGFnZUV4dGVuc2lvbkVycm9yOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbDsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbERvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxEb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbERvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbERvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxEb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRG9jdW1lbnRQcm92aWRlcl9TYXZlQXNPcGVyYXRpb247DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbml0RGlhZ3JhbUZpbGVfUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pdERpYWdyYW1GaWxlX1Jlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pdERpYWdyYW1GaWxlX1dpemFyZFRpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pdERpYWdyYW1GaWxlX09wZW5Nb2RlbEZpbGVEaWFsb2dUaXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb247DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21yZWxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRGlhZ3JhbUVkaXRvcl9TYXZpbmdEZWxldGVkRmlsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbERpYWdyYW1FZGl0b3JfU2F2ZUFzRXJyb3JUaXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbERpYWdyYW1FZGl0b3JfU2F2ZUFzRXJyb3JNZXNzYWdlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcmVsRGlhZ3JhbUVkaXRvcl9TYXZlRXJyb3JUaXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbERpYWdyYW1FZGl0b3JfU2F2ZUVycm9yTWVzc2FnZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbEVsZW1lbnRDaG9vc2VyRGlhbG9nX1NlbGVjdE1vZGVsRWxlbWVudFRpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZU1lc3NhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0ZUFjdGlvbk1lc3NhZ2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb3NpdGVVbml0czFHcm91cF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0b21pY1VuaXRzMkdyb3VwX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyVW5pdHMzR3JvdXBfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlVW5pdHM0R3JvdXBfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQb3J0czVHcm91cF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdzNkdyb3VwX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FydGVzaWFuUXVldWVkVW5pdDFDcmVhdGlvblRvb2xfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0MUNyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uQ2hlY2syQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uQ2hlY2syQ3JlYXRpb25Ub29sX2Rlc2M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXQzQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0M0NyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYWxsZWxRdWV1ZWRVbml0NENyZWF0aW9uVG9vbF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcmFsbGVsUXVldWVkVW5pdDRDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbnRpYWxVbml0NUNyZWF0aW9uVG9vbF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbnRpYWxVbml0NUNyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdDZDcmVhdGlvblRvb2xfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaW5nbGVRdWV1ZWRVbml0NkNyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXRvbWljVW5pdDFDcmVhdGlvblRvb2xfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBdG9taWNVbml0MUNyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlGaWx0ZXJVbml0MUNyZWF0aW9uVG9vbF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpRmlsdGVyVW5pdDFDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZUZpbHRlclVuaXQyQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlRmlsdGVyVW5pdDJDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpRmVhdHVyZVVuaXQxQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlGZWF0dXJlVW5pdDFDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZUZlYXR1cmVVbml0MkNyZWF0aW9uVG9vbF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZUZlYXR1cmVVbml0MkNyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlJbnB1dFBvcnQxQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlJbnB1dFBvcnQxQ3JlYXRpb25Ub29sX2Rlc2M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aU91dHB1dFBvcnQyQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlPdXRwdXRQb3J0MkNyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlSW5wdXRQb3J0M0NyZWF0aW9uVG9vbF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZUlucHV0UG9ydDNDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZU91dHB1dFBvcnQ0Q3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlT3V0cHV0UG9ydDRDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUG9ydE1hcHBpbmcxQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlQb3J0TWFwcGluZzFDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpU2luZ2xlUG9ydE1hcHBpbmcyQ3JlYXRpb25Ub29sX3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZzJDcmVhdGlvblRvb2xfZGVzYzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZVBvcnRNYXBwaW5nM0NyZWF0aW9uVG9vbF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZVBvcnRNYXBwaW5nM0NyZWF0aW9uVG9vbF9kZXNjOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzRWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50M0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NEVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NkVkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0X3RpdGxlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydF90aXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnRfdGl0bGU7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTmFtZV9PcGVuRGlhZ3JhbTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDE3X2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAxN19vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDM1X2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMzVfb3V0Z29pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDMyX2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAzMl9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDEzX2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMTNfb3V0Z29pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDI0X2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAyNF9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpUG9ydE1hcHBpbmdfNDAwMl90YXJnZXQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlQb3J0TWFwcGluZ180MDAyX3NvdXJjZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDIwX2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAyMF9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZU91dHB1dFBvcnRfMzAxOF9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDFfdGFyZ2V0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZVBvcnRNYXBwaW5nXzQwMDFfc291cmNlOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMTBfaW5jb21pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDEwX291dGdvaW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMjNfaW5jb21pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAyM19vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpT3V0cHV0UG9ydF8zMDE1X291dGdvaW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlT3V0cHV0UG9ydF8zMDExX291dGdvaW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDVfaW5jb21pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAwNV9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMDJfaW5jb21pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDAyX291dGdvaW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAwNl9pbmNvbWluZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpSW5wdXRQb3J0XzMwMDZfb3V0Z29pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAzMV9pbmNvbWluZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDMxX291dGdvaW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlPdXRwdXRQb3J0XzMwMjFfb3V0Z29pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMjAwMV9pbmNvbWluZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8yMDAxX291dGdvaW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDlfaW5jb21pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAwOV9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX0NvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDBfbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMjdfaW5jb21pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9TaW5nbGVJbnB1dFBvcnRfMzAyN19vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX1NpbmdsZUlucHV0UG9ydF8zMDAxX2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfU2luZ2xlSW5wdXRQb3J0XzMwMDFfb3V0Z29pbmdsaW5rczsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDI4X2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAyOF9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yR3JvdXBOYW1lX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfNDAwM190YXJnZXQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzX3NvdXJjZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRvckdyb3VwTmFtZV9NdWx0aUlucHV0UG9ydF8zMDE0X2luY29taW5nbGlua3M7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0b3JHcm91cE5hbWVfTXVsdGlJbnB1dFBvcnRfMzAxNF9vdXRnb2luZ2xpbmtzOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXJfT3BlbkRpYWdyYW1BY3Rpb25OYW1lOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RQYXJzZXJfVW5leHBlY3RlZFZhbHVlVHlwZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UGFyc2VyX1dyb25nU3RyaW5nQ29udmVyc2lvbjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0UGFyc2VyX1Vua25vd25MaXRlcmFsOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZUZvcm1hdFBhcnNlcl9JbnZhbGlkSW5wdXRFcnJvcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJUaXRsZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJNZXNzYWdlOw0KKw0KKwkvL1RPRE86IHB1dCBhY2Nlc3NvciBmaWVsZHMgbWFudWFsbHkJDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDU0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCisNCisvKioNCisgKiBXaXphcmQgcGFnZSB0aGF0IGFsbG93cyB0byBzZWxlY3QgZWxlbWVudCBmcm9tIG1vZGVsLg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2Ugew0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0ZWRNb2RlbEVsZW1lbnQ7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFRyZWVWaWV3ZXIgbW9kZWxWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsNCisJCXN1cGVyKHBhZ2VOYW1lKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVPYmplY3QgZ2V0TW9kZWxFbGVtZW50KCkgew0KKwkJcmV0dXJuIHNlbGVjdGVkTW9kZWxFbGVtZW50Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRNb2RlbEVsZW1lbnQoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsNCisJCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbW9kZWxFbGVtZW50Ow0KKwkJaWYgKG1vZGVsVmlld2VyICE9IG51bGwpIHsNCisJCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgew0KKwkJCQltb2RlbFZpZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7DQorCQkJCW1vZGVsVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigNCisJCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOw0KKwkJCX0gZWxzZSB7DQorCQkJCW1vZGVsVmlld2VyLnNldElucHV0KG51bGwpOw0KKwkJCX0NCisJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCisJCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOw0KKw0KKwkJQ29tcG9zaXRlIHBsYXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCisJCXBsYXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOw0KKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsNCisJCXBsYXRlLnNldExheW91dChsYXlvdXQpOw0KKwkJc2V0Q29udHJvbChwbGF0ZSk7DQorDQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwbGF0ZSwgU1dULk5PTkUpOw0KKwkJbGFiZWwuc2V0VGV4dChnZXRTZWxlY3Rpb25UaXRsZSgpKTsNCisJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7DQorDQorCQltb2RlbFZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBsYXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMDQorCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7DQorCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQorCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSAzMDA7DQorCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDMwMDsNCisJCW1vZGVsVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOw0KKwkJbW9kZWxWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigNCisJCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7DQorCQltb2RlbFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoDQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOw0KKwkJaWYgKHNlbGVjdGVkTW9kZWxFbGVtZW50ICE9IG51bGwpIHsNCisJCQltb2RlbFZpZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7DQorCQkJbW9kZWxWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKA0KKwkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsNCisJCX0NCisJCW1vZGVsVmlld2VyDQorCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQorCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KKwkJCQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UudGhpcw0KKwkJCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50DQorCQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7DQorCQkJCQl9DQorCQkJCX0pOw0KKw0KKwkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gbW9kZWwgZWxlbWVudCBkZXNjcmlwdGlvbi4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsNCisJCXJldHVybiBNZXNzYWdlcy5Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlTWVzc2FnZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBudWxsOw0KKwkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgew0KKwkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQorCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKSB7DQorCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkRWxlbWVudCkNCisJCQkJCQkuZ2V0VmFsdWUoKTsNCisJCQl9DQorCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZlYXR1cmVNYXAuRW50cnkpIHsNCisJCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChGZWF0dXJlTWFwLkVudHJ5KSBzZWxlY3RlZEVsZW1lbnQpDQorCQkJCQkJLmdldFZhbHVlKCk7DQorCQkJfQ0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7DQorCQkJCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gKEVPYmplY3QpIHNlbGVjdGVkRWxlbWVudDsNCisJCQl9DQorCQl9DQorCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBPdmVycmlkZSB0byBwcm92aWRlIHNwZWNpZmljIHZhbGlkYXRpb24gb2YgdGhlIHNlbGVjdGVkIG1vZGVsIGVsZW1lbnQuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9WYWxpZGF0ZUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L1ZhbGlkYXRlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNzJlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9WYWxpZGF0ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAwIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydDsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5FdmFsdWF0aW9uTW9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSUNvbnN0cmFpbnRTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUJhdGNoVmFsaWRhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLk1vZGVsVmFsaWRhdGlvblNlcnZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5PZmZzY3JlZW5FZGl0UGFydEZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbVdvcmtiZW5jaFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbjsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbE1hcmtlck5hdmlnYXRpb25Qcm92aWRlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzLkNvbXJlbFZhbGlkYXRpb25Qcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgcGFnZTsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBWYWxpZGF0ZUFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlKSB7DQorCQlzZXRUZXh0KE1lc3NhZ2VzLlZhbGlkYXRlQWN0aW9uTWVzc2FnZSk7DQorCQl0aGlzLnBhZ2UgPSBwYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQlJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7DQorCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElEaWFncmFtV29ya2JlbmNoUGFydCkgew0KKwkJCWZpbmFsIElEaWFncmFtV29ya2JlbmNoUGFydCBwYXJ0ID0gKElEaWFncmFtV29ya2JlbmNoUGFydCkgd29ya2JlbmNoUGFydDsNCisJCQl0cnkgew0KKwkJCQluZXcgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbigNCisJCQkJCQluZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgew0KKw0KKwkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KKwkJCQkJCQkJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwNCisJCQkJCQkJCQlJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsNCisJCQkJCQkJCXJ1blZhbGlkYXRpb24ocGFydC5nZXREaWFncmFtRWRpdFBhcnQoKSwNCisJCQkJCQkJCQkJcGFydC5nZXREaWFncmFtKCkpOw0KKwkJCQkJCQl9DQorCQkJCQkJfSkucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCQkiVmFsaWRhdGlvbiBhY3Rpb24gZmFpbGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5WYWxpZGF0aW9uKFZpZXcgdmlldykgew0KKwkJdHJ5IHsNCisJCQlpZiAoQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0odmlldy5lUmVzb3VyY2UoKSkpIHsNCisJCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCisJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpDQorCQkJCQkJLmdldEFjdGl2ZUVkaXRvcigpOw0KKwkJCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElEaWFncmFtV29ya2JlbmNoUGFydCkgew0KKwkJCQkJcnVuVmFsaWRhdGlvbigNCisJCQkJCQkJKChJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpIGVkaXRvclBhcnQpDQorCQkJCQkJCQkJLmdldERpYWdyYW1FZGl0UGFydCgpLA0KKwkJCQkJCQl2aWV3KTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCXJ1bk5vblVJVmFsaWRhdGlvbih2aWV3KTsNCisJCQkJfQ0KKwkJCX0NCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KKwkJCQkJIlZhbGlkYXRpb24gYWN0aW9uIGZhaWxlZCIsIGUpOyAvLyROT04tTkxTLTEkDQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5Ob25VSVZhbGlkYXRpb24oVmlldyB2aWV3KSB7DQorCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gT2Zmc2NyZWVuRWRpdFBhcnRGYWN0b3J5DQorCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZURpYWdyYW1FZGl0UGFydCh2aWV3LmdldERpYWdyYW0oKSk7DQorCQlydW5WYWxpZGF0aW9uKGRpYWdyYW1FZGl0UGFydCwgdmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5WYWxpZGF0aW9uKERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQsIFZpZXcgdmlldykgew0KKwkJZmluYWwgRGlhZ3JhbUVkaXRQYXJ0IGZwYXJ0ID0gZGlhZ3JhbUVkaXRQYXJ0Ow0KKwkJZmluYWwgVmlldyBmdmlldyA9IHZpZXc7DQorCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0eERvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbA0KKwkJCQkuZ2V0RWRpdGluZ0RvbWFpbih2aWV3KTsNCisJCUNvbXJlbFZhbGlkYXRpb25Qcm92aWRlci5ydW5XaXRoQ29uc3RyYWludHModHhEb21haW4sIG5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCXZhbGlkYXRlKGZwYXJ0LCBmdmlldyk7DQorCQkJfQ0KKwkJfSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIERpYWdub3N0aWMgcnVuRU1GVmFsaWRhdG9yKFZpZXcgdGFyZ2V0KSB7DQorCQlpZiAodGFyZ2V0LmlzU2V0RWxlbWVudCgpICYmIHRhcmdldC5nZXRFbGVtZW50KCkgIT0gbnVsbCkgew0KKwkJCXJldHVybiBuZXcgRGlhZ25vc3RpY2lhbigpIHsNCisNCisJCQkJcHVibGljIFN0cmluZyBnZXRPYmplY3RMYWJlbChFT2JqZWN0IGVPYmplY3QpIHsNCisJCQkJCXJldHVybiBFTUZDb3JlVXRpbC5nZXRRdWFsaWZpZWROYW1lKGVPYmplY3QsIHRydWUpOw0KKwkJCQl9DQorCQkJfS52YWxpZGF0ZSh0YXJnZXQuZ2V0RWxlbWVudCgpKTsNCisJCX0NCisJCXJldHVybiBEaWFnbm9zdGljLk9LX0lOU1RBTkNFOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlKERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQsIFZpZXcgdmlldykgew0KKwkJSUZpbGUgdGFyZ2V0ID0gdmlldy5lUmVzb3VyY2UoKSAhPSBudWxsID8gV29ya3NwYWNlU3luY2hyb25pemVyDQorCQkJCS5nZXRGaWxlKHZpZXcuZVJlc291cmNlKCkpIDogbnVsbDsNCisJCWlmICh0YXJnZXQgIT0gbnVsbCkgew0KKwkJCUNvbXJlbE1hcmtlck5hdmlnYXRpb25Qcm92aWRlci5kZWxldGVNYXJrZXJzKHRhcmdldCk7DQorCQl9DQorCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBydW5FTUZWYWxpZGF0b3Iodmlldyk7DQorCQljcmVhdGVNYXJrZXJzKHRhcmdldCwgZGlhZ25vc3RpYywgZGlhZ3JhbUVkaXRQYXJ0KTsNCisJCUlCYXRjaFZhbGlkYXRvciB2YWxpZGF0b3IgPSAoSUJhdGNoVmFsaWRhdG9yKSBNb2RlbFZhbGlkYXRpb25TZXJ2aWNlDQorCQkJCS5nZXRJbnN0YW5jZSgpLm5ld1ZhbGlkYXRvcihFdmFsdWF0aW9uTW9kZS5CQVRDSCk7DQorCQl2YWxpZGF0b3Iuc2V0SW5jbHVkZUxpdmVDb25zdHJhaW50cyh0cnVlKTsNCisJCWlmICh2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwpIHsNCisJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZSh2aWV3LmdldEVsZW1lbnQoKSk7DQorCQkJY3JlYXRlTWFya2Vycyh0YXJnZXQsIHN0YXR1cywgZGlhZ3JhbUVkaXRQYXJ0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVNYXJrZXJzKElGaWxlIHRhcmdldCwgSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzLA0KKwkJCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQpIHsNCisJCWlmICh2YWxpZGF0aW9uU3RhdHVzLmlzT0soKSkgew0KKwkJCXJldHVybjsNCisJCX0NCisJCWZpbmFsIElTdGF0dXMgcm9vdFN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXM7DQorCQlMaXN0IGFsbFN0YXR1c2VzID0gbmV3IEFycmF5TGlzdCgpOw0KKwkJQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwuTGF6eUVsZW1lbnQyVmlld01hcCBlbGVtZW50MlZpZXdNYXAgPSBuZXcgQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwuTGF6eUVsZW1lbnQyVmlld01hcCgNCisJCQkJZGlhZ3JhbUVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCksIGNvbGxlY3RUYXJnZXRFbGVtZW50cygNCisJCQkJCQlyb290U3RhdHVzLCBuZXcgSGFzaFNldDxFT2JqZWN0PigpLCBhbGxTdGF0dXNlcykpOw0KKwkJZm9yIChJdGVyYXRvciBpdCA9IGFsbFN0YXR1c2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlJQ29uc3RyYWludFN0YXR1cyBuZXh0U3RhdHVzID0gKElDb25zdHJhaW50U3RhdHVzKSBpdC5uZXh0KCk7DQorCQkJVmlldyB2aWV3ID0gQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWwuZmluZFZpZXcoZGlhZ3JhbUVkaXRQYXJ0LA0KKwkJCQkJbmV4dFN0YXR1cy5nZXRUYXJnZXQoKSwgZWxlbWVudDJWaWV3TWFwKTsNCisJCQlhZGRNYXJrZXIoZGlhZ3JhbUVkaXRQYXJ0LmdldFZpZXdlcigpLCB0YXJnZXQsIHZpZXcuZVJlc291cmNlKCkNCisJCQkJCS5nZXRVUklGcmFnbWVudCh2aWV3KSwgRU1GQ29yZVV0aWwuZ2V0UXVhbGlmaWVkTmFtZSgNCisJCQkJCW5leHRTdGF0dXMuZ2V0VGFyZ2V0KCksIHRydWUpLCBuZXh0U3RhdHVzLmdldE1lc3NhZ2UoKSwNCisJCQkJCW5leHRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlTWFya2VycyhJRmlsZSB0YXJnZXQsDQorCQkJRGlhZ25vc3RpYyBlbWZWYWxpZGF0aW9uU3RhdHVzLCBEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0KSB7DQorCQlpZiAoZW1mVmFsaWRhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IERpYWdub3N0aWMuT0spIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlmaW5hbCBEaWFnbm9zdGljIHJvb3RTdGF0dXMgPSBlbWZWYWxpZGF0aW9uU3RhdHVzOw0KKwkJTGlzdCBhbGxEaWFnbm9zdGljcyA9IG5ldyBBcnJheUxpc3QoKTsNCisJCUNvbXJlbERpYWdyYW1FZGl0b3JVdGlsLkxhenlFbGVtZW50MlZpZXdNYXAgZWxlbWVudDJWaWV3TWFwID0gbmV3IENvbXJlbERpYWdyYW1FZGl0b3JVdGlsLkxhenlFbGVtZW50MlZpZXdNYXAoDQorCQkJCWRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpLCBjb2xsZWN0VGFyZ2V0RWxlbWVudHMoDQorCQkJCQkJcm9vdFN0YXR1cywgbmV3IEhhc2hTZXQ8RU9iamVjdD4oKSwgYWxsRGlhZ25vc3RpY3MpKTsNCisJCWZvciAoSXRlcmF0b3IgaXQgPSBlbWZWYWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJLmhhc05leHQoKTspIHsNCisJCQlEaWFnbm9zdGljIG5leHREaWFnbm9zdGljID0gKERpYWdub3N0aWMpIGl0Lm5leHQoKTsNCisJCQlMaXN0IGRhdGEgPSBuZXh0RGlhZ25vc3RpYy5nZXREYXRhKCk7DQorCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiAhZGF0YS5pc0VtcHR5KCkNCisJCQkJCSYmIGRhdGEuZ2V0KDApIGluc3RhbmNlb2YgRU9iamVjdCkgew0KKwkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgZGF0YS5nZXQoMCk7DQorCQkJCVZpZXcgdmlldyA9IENvbXJlbERpYWdyYW1FZGl0b3JVdGlsLmZpbmRWaWV3KGRpYWdyYW1FZGl0UGFydCwNCisJCQkJCQllbGVtZW50LCBlbGVtZW50MlZpZXdNYXApOw0KKwkJCQlhZGRNYXJrZXIoDQorCQkJCQkJZGlhZ3JhbUVkaXRQYXJ0LmdldFZpZXdlcigpLA0KKwkJCQkJCXRhcmdldCwNCisJCQkJCQl2aWV3LmVSZXNvdXJjZSgpLmdldFVSSUZyYWdtZW50KHZpZXcpLA0KKwkJCQkJCUVNRkNvcmVVdGlsLmdldFF1YWxpZmllZE5hbWUoZWxlbWVudCwgdHJ1ZSksDQorCQkJCQkJbmV4dERpYWdub3N0aWMuZ2V0TWVzc2FnZSgpLA0KKwkJCQkJCWRpYWdub3N0aWNUb1N0YXR1c1NldmVyaXR5KG5leHREaWFnbm9zdGljLmdldFNldmVyaXR5KCkpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkTWFya2VyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgSUZpbGUgdGFyZ2V0LA0KKwkJCVN0cmluZyBlbGVtZW50SWQsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG1lc3NhZ2UsDQorCQkJaW50IHN0YXR1c1NldmVyaXR5KSB7DQorCQlpZiAodGFyZ2V0ID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlDb21yZWxNYXJrZXJOYXZpZ2F0aW9uUHJvdmlkZXIuYWRkTWFya2VyKHRhcmdldCwgZWxlbWVudElkLCBsb2NhdGlvbiwNCisJCQkJbWVzc2FnZSwgc3RhdHVzU2V2ZXJpdHkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBpbnQgZGlhZ25vc3RpY1RvU3RhdHVzU2V2ZXJpdHkoaW50IGRpYWdub3N0aWNTZXZlcml0eSkgew0KKwkJaWYgKGRpYWdub3N0aWNTZXZlcml0eSA9PSBEaWFnbm9zdGljLk9LKSB7DQorCQkJcmV0dXJuIElTdGF0dXMuT0s7DQorCQl9IGVsc2UgaWYgKGRpYWdub3N0aWNTZXZlcml0eSA9PSBEaWFnbm9zdGljLklORk8pIHsNCisJCQlyZXR1cm4gSVN0YXR1cy5JTkZPOw0KKwkJfSBlbHNlIGlmIChkaWFnbm9zdGljU2V2ZXJpdHkgPT0gRGlhZ25vc3RpYy5XQVJOSU5HKSB7DQorCQkJcmV0dXJuIElTdGF0dXMuV0FSTklORzsNCisJCX0gZWxzZSBpZiAoZGlhZ25vc3RpY1NldmVyaXR5ID09IERpYWdub3N0aWMuRVJST1INCisJCQkJfHwgZGlhZ25vc3RpY1NldmVyaXR5ID09IERpYWdub3N0aWMuQ0FOQ0VMKSB7DQorCQkJcmV0dXJuIElTdGF0dXMuRVJST1I7DQorCQl9DQorCQlyZXR1cm4gSVN0YXR1cy5JTkZPOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTZXQ8RU9iamVjdD4gY29sbGVjdFRhcmdldEVsZW1lbnRzKElTdGF0dXMgc3RhdHVzLA0KKwkJCVNldDxFT2JqZWN0PiB0YXJnZXRFbGVtZW50Q29sbGVjdG9yLCBMaXN0IGFsbENvbnN0cmFpbnRTdGF0dXNlcykgew0KKwkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIElDb25zdHJhaW50U3RhdHVzKSB7DQorCQkJdGFyZ2V0RWxlbWVudENvbGxlY3Rvcg0KKwkJCQkJLmFkZCgoKElDb25zdHJhaW50U3RhdHVzKSBzdGF0dXMpLmdldFRhcmdldCgpKTsNCisJCQlhbGxDb25zdHJhaW50U3RhdHVzZXMuYWRkKHN0YXR1cyk7DQorCQl9DQorCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgew0KKwkJCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCisJCQkJY29sbGVjdFRhcmdldEVsZW1lbnRzKGNoaWxkcmVuW2ldLCB0YXJnZXRFbGVtZW50Q29sbGVjdG9yLA0KKwkJCQkJCWFsbENvbnN0cmFpbnRTdGF0dXNlcyk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHRhcmdldEVsZW1lbnRDb2xsZWN0b3I7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIFNldDxFT2JqZWN0PiBjb2xsZWN0VGFyZ2V0RWxlbWVudHMoRGlhZ25vc3RpYyBkaWFnbm9zdGljLA0KKwkJCVNldDxFT2JqZWN0PiB0YXJnZXRFbGVtZW50Q29sbGVjdG9yLCBMaXN0IGFsbERpYWdub3N0aWNzKSB7DQorCQlMaXN0IGRhdGEgPSBkaWFnbm9zdGljLmdldERhdGEoKTsNCisJCUVPYmplY3QgdGFyZ2V0ID0gbnVsbDsNCisJCWlmIChkYXRhICE9IG51bGwgJiYgIWRhdGEuaXNFbXB0eSgpICYmIGRhdGEuZ2V0KDApIGluc3RhbmNlb2YgRU9iamVjdCkgew0KKwkJCXRhcmdldCA9IChFT2JqZWN0KSBkYXRhLmdldCgwKTsNCisJCQl0YXJnZXRFbGVtZW50Q29sbGVjdG9yLmFkZCh0YXJnZXQpOw0KKwkJCWFsbERpYWdub3N0aWNzLmFkZChkaWFnbm9zdGljKTsNCisJCX0NCisJCWlmIChkaWFnbm9zdGljLmdldENoaWxkcmVuKCkgIT0gbnVsbA0KKwkJCQkmJiAhZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkgew0KKwkJCWZvciAoSXRlcmF0b3IgaXQgPSBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXQNCisJCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJCWNvbGxlY3RUYXJnZXRFbGVtZW50cygoRGlhZ25vc3RpYykgaXQubmV4dCgpLA0KKwkJCQkJCXRhcmdldEVsZW1lbnRDb2xsZWN0b3IsIGFsbERpYWdub3N0aWNzKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gdGFyZ2V0RWxlbWVudENvbGxlY3RvcjsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvY3VzdG9tL0VsZW1lbnRUeXBlV2l0aElkLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvY3VzdG9tL0VsZW1lbnRUeXBlV2l0aElkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmN2RhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9jdXN0b20vRWxlbWVudFR5cGVXaXRoSWQuamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnBhcnQuY3VzdG9tOw0KKw0KK2ltcG9ydCBqYXZhLm5ldC5VUkw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuSUVkaXRIZWxwZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsNCisNCisNCisvKioNCisgKiBOZXVlcyBFbGVtZW50VHlwIG1pdCBkZW0gQXR0cmlidXQgcmVmSWQNCisgKiBAYXV0aG9yIEdlcnJpdA0KKyAqDQorICovDQorcHVibGljIGNsYXNzIEVsZW1lbnRUeXBlV2l0aElkIGltcGxlbWVudHMgSUVsZW1lbnRUeXBlIHsNCisNCisJZmluYWwgU3RyaW5nIHJlZklkOw0KKwlmaW5hbCBJRWxlbWVudFR5cGUgaUVsZW1lbnRUeXBlOw0KKwkNCisJcHVibGljIEVsZW1lbnRUeXBlV2l0aElkKFN0cmluZyByZWZJZCwgSUVsZW1lbnRUeXBlIGlFbGVtZW50VHlwZSl7DQorCQl0aGlzLnJlZklkPXJlZklkOw0KKwkJdGhpcy5pRWxlbWVudFR5cGU9aUVsZW1lbnRUeXBlOw0KKwl9DQorCQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gY2FuRWRpdChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgew0KKwkJDQorCQlyZXR1cm4gaUVsZW1lbnRUeXBlLmNhbkVkaXQocmVxKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIElFbGVtZW50VHlwZVtdIGdldEFsbFN1cGVyVHlwZXMoKSB7DQorCQlyZXR1cm4gaUVsZW1lbnRUeXBlLmdldEFsbFN1cGVyVHlwZXMoKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsNCisJCXJldHVybiBpRWxlbWVudFR5cGUuZ2V0RGlzcGxheU5hbWUoKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEVDbGFzcyBnZXRFQ2xhc3MoKSB7DQorCQlyZXR1cm4gaUVsZW1lbnRUeXBlLmdldEVDbGFzcygpOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgSUNvbW1hbmQgZ2V0RWRpdENvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7DQorCQlyZXR1cm4gaUVsZW1lbnRUeXBlLmdldEVkaXRDb21tYW5kKHJlcXVlc3QpOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgSUVkaXRIZWxwZXIgZ2V0RWRpdEhlbHBlcigpIHsNCisJCXJldHVybiBpRWxlbWVudFR5cGUuZ2V0RWRpdEhlbHBlcigpOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgVVJMIGdldEljb25VUkwoKSB7DQorCQlyZXR1cm4gaUVsZW1lbnRUeXBlLmdldEljb25VUkwoKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCisJCXJldHVybiBpRWxlbWVudFR5cGUuZ2V0SWQoKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsNCisJCXJldHVybiBpRWxlbWVudFR5cGUuZ2V0QWRhcHRlcihhZGFwdGVyKTsNCisJfQ0KKw0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCisJCXJldHVybiBpRWxlbWVudFR5cGUuZXF1YWxzKG9iaik7DQorCX0NCisNCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorCQlyZXR1cm4gaUVsZW1lbnRUeXBlLmhhc2hDb2RlKCk7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlyZXR1cm4gaUVsZW1lbnRUeXBlLnRvU3RyaW5nKCk7DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRSZWZJZCgpew0KKwkJcmV0dXJuIHRoaXMucmVmSWQ7DQorCX0NCisJDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9jdXN0b20vVG9vbEVudHJ5Q29tcGFyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L2N1c3RvbS9Ub29sRW50cnlDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5M2VjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcGFydC9jdXN0b20vVG9vbEVudHJ5Q29tcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucGFydC5jdXN0b207DQorDQoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7DQorDQorLyoqDQorICogQ29tcGFyYXRvciB6dW0gc29ydGllcmVuIHZvbiBUb29sRW50cnlzDQorICogQGF1dGhvciBHZXJyaXQNCisgKg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUb29sRW50cnlDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxUb29sRW50cnk+IHsNCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBpbnQgY29tcGFyZShUb29sRW50cnkgYXJnMCwgVG9vbEVudHJ5IGFyZzEpIHsNCisJCWludCByZXN1bHQgPSAwOw0KKwkJcmVzdWx0ID0gYXJnMC5nZXRMYWJlbCgpLmNvbXBhcmVUbyhhcmcxLmdldExhYmVsKCkpOw0KKwkJaWYocmVzdWx0ID09IDApIHsNCisJCQlyZXN1bHQgPSBhcmcwLmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvKGFyZzEuZ2V0RGVzY3JpcHRpb24oKSk7DQorCQl9DQorCQlpZihyZXN1bHQgPT0gMCkgew0KKwkJCXJlc3VsdCA9IGFyZzAuZ2V0SWQoKS5jb21wYXJlVG8oYXJnMS5nZXRJZCgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L2N1c3RvbS9VbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2xXaXRoVW5pdElkLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3BhcnQvY3VzdG9tL1Vuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbFdpdGhVbml0SWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGRiNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wYXJ0L2N1c3RvbS9VbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2xXaXRoVW5pdElkLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wYXJ0LmN1c3RvbTsNCisNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbDsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxQYWxldHRlRmFjdG9yeTsNCisNCisvKioNCisgKiBlcnN0ZWxsdCBlaW5lbiB1bnNwZXppZml6aWVydGVzIENyZWF0aW9uVG9vbCBtaXQgVW5pdElkDQorICogQGF1dGhvciBHZXJyaXQNCisgKg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2xXaXRoVW5pdElkIGV4dGVuZHMgVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sIHsNCisNCisJU3RyaW5nIHVuaXRJZCA9IiI7DQorCQ0KKwlwdWJsaWMgVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sV2l0aFVuaXRJZChMaXN0IGVsZW1lbnRUeXBlcywgU3RyaW5nIHVuaXRJZCkgew0KKwkJc3VwZXIoZWxlbWVudFR5cGVzKTsNCisJCXRoaXMudW5pdElkID0gdW5pdElkOw0KKwl9DQorCQ0KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXRJZCgpew0KKwkJcmV0dXJuIHRoaXMudW5pdElkOw0KKwl9DQorCQ0KKwkvKioNCisJICogRXJzdGVsbHQgZWluZW4gUmVxdWVzdCwgZvxndCBpaG0gdm9yaGVyIG5vY2ggZGllIFVOSVRfSUQgaGluenUNCisJICovDQorCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7DQorCQlSZXF1ZXN0IHJlcXVlc3QgPSBzdXBlci5jcmVhdGVUYXJnZXRSZXF1ZXN0KCk7DQorCQlyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLnB1dChDb21yZWxQYWxldHRlRmFjdG9yeS5VTklUX0lELCB1bml0SWQpOw0KKwkJcmV0dXJuIHJlcXVlc3Q7DQorCX0NCisJDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMjBlMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wcmVmZXJlbmNlczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2Ugew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UoKSB7DQorCQlzZXRQcmVmZXJlbmNlU3RvcmUoQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTYzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByZWZlcmVuY2VzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UoKSB7DQorCQlzZXRQcmVmZXJlbmNlU3RvcmUoQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTIwY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByZWZlcmVuY2VzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkRpYWdyYW1zUHJlZmVyZW5jZVBhZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBEaWFncmFtc1ByZWZlcmVuY2VQYWdlIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlKCkgew0KKwkJc2V0UHJlZmVyZW5jZVN0b3JlKENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQ0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3ZmY4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wcmVmZXJlbmNlczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgew0KKwkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOw0KKwkJRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOw0KKwkJRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOw0KKwkJRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsNCisJCURpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7DQorCQlEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7DQorDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsNCisJCXJldHVybiBDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYmZmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByZWZlcmVuY2VzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlByaW50aW5nUHJlZmVyZW5jZVBhZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UoKSB7DQorCQlzZXRQcmVmZXJlbmNlU3RvcmUoQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIwZTllCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByZWZlcmVuY2VzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUnVsZXJHcmlkUHJlZmVyZW5jZVBhZ2Ugew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UoKSB7DQorCQlzZXRQcmVmZXJlbmNlU3RvcmUoQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsRWRpdFBhcnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsRWRpdFBhcnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MGU2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxFZGl0UGFydFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnM7DQorDQoraW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5lZGl0cGFydC5BYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LklFZGl0UGFydE9wZXJhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbXJlbEVkaXRQYXJ0RmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsRWRpdFBhcnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RWRpdFBhcnRQcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBib29sZWFuIGFsbG93Q2FjaGluZzsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgV2Vha1JlZmVyZW5jZSBjYWNoZWRQYXJ0Ow0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFZpZXc7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcmVsRWRpdFBhcnRQcm92aWRlcigpIHsNCisJCXNldEZhY3RvcnkobmV3IENvbXJlbEVkaXRQYXJ0RmFjdG9yeSgpKTsNCisJCXNldEFsbG93Q2FjaGluZyh0cnVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGZpbmFsIEVkaXRQYXJ0RmFjdG9yeSBnZXRGYWN0b3J5KCkgew0KKwkJcmV0dXJuIGZhY3Rvcnk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIHNldEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsNCisJCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWxsb3dDYWNoaW5nKCkgew0KKwkJcmV0dXJuIGFsbG93Q2FjaGluZzsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldEFsbG93Q2FjaGluZyhib29sZWFuIGFsbG93Q2FjaGluZykgew0KKwkJdGhpcy5hbGxvd0NhY2hpbmcgPSBhbGxvd0NhY2hpbmc7DQorCQlpZiAoIWFsbG93Q2FjaGluZykgew0KKwkJCWNhY2hlZFBhcnQgPSBudWxsOw0KKwkJCWNhY2hlZFZpZXcgPSBudWxsOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJRWRpdFBhcnQgcGFydCA9IGZhY3RvcnkuY3JlYXRlRWRpdFBhcnQobnVsbCwgdmlldyk7DQorCQlpZiAocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgew0KKwkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0Ow0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2FjaGVkUGFydChWaWV3IHZpZXcpIHsNCisJCWlmIChjYWNoZWRWaWV3ICE9IG51bGwgJiYgY2FjaGVkVmlldy5nZXQoKSA9PSB2aWV3KSB7DQorCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIGNhY2hlZFBhcnQuZ2V0KCk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN5bmNocm9uaXplZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KFZpZXcgdmlldykgew0KKwkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsNCisJCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGdldENhY2hlZFBhcnQodmlldyk7DQorCQkJY2FjaGVkUGFydCA9IG51bGw7DQorCQkJY2FjaGVkVmlldyA9IG51bGw7DQorCQkJaWYgKHBhcnQgIT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gcGFydDsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gY3JlYXRlRWRpdFBhcnQodmlldyk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgew0KKwkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIENyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbikgew0KKwkJCVZpZXcgdmlldyA9ICgoSUVkaXRQYXJ0T3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZpZXcoKTsNCisJCQlpZiAoIUNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTU9ERUxfSUQNCisJCQkJCS5lcXVhbHMoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCWlmIChpc0FsbG93Q2FjaGluZygpICYmIGdldENhY2hlZFBhcnQodmlldykgIT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBjcmVhdGVFZGl0UGFydCh2aWV3KTsNCisJCQlpZiAocGFydCAhPSBudWxsKSB7DQorCQkJCWlmIChpc0FsbG93Q2FjaGluZygpKSB7DQorCQkJCQljYWNoZWRQYXJ0ID0gbmV3IFdlYWtSZWZlcmVuY2UocGFydCk7DQorCQkJCQljYWNoZWRWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2Uodmlldyk7DQorCQkJCX0NCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbEVsZW1lbnRUeXBlcy5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsRWxlbWVudFR5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiNGRmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbEVsZW1lbnRUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMTE3MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByb3ZpZGVyczsNCisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbkNoZWNrRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbmRpdGlvbmFsVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUlucHV0UG9ydDhFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbEVsZW1lbnRUeXBlcyB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIENvbXJlbEVsZW1lbnRUeXBlcygpIHsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgTWFwPElFbGVtZW50VHlwZSwgRU5hbWVkRWxlbWVudD4gZWxlbWVudHM7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTZXQ8SUVsZW1lbnRUeXBlPiBLTk9XTl9FTEVNRU5UX1RZUEVTOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5Db21wb3NpdGVSZWZhY3RvcmluZ18xMDAwIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFNpbmdsZUlucHV0UG9ydF8yMDAxID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZUlucHV0UG9ydF8yMDAxIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMiA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDIiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlUXVldWVkVW5pdF8yMDA0ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTZXF1ZW50aWFsVW5pdF8yMDA1ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNlcXVlbnRpYWxVbml0XzIwMDUiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29uZGl0aW9uYWxVbml0XzIwMDYgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzIwMDYiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQXRvbWljVW5pdF8yMDA3ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMjAwNyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVJbnB1dFBvcnRfMzAwMSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAwMSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUlucHV0UG9ydF8zMDAyID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMDIiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBQYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNCIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVJbnB1dFBvcnRfMzAwNSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAwNSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUlucHV0UG9ydF8zMDA2ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMDYiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVGZWF0dXJlVW5pdF8zMDA4ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwMDgiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlSW5wdXRQb3J0XzMwMDkgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMDkiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlJbnB1dFBvcnRfMzAxMCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDEwIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFNpbmdsZU91dHB1dFBvcnRfMzAxMSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVPdXRwdXRQb3J0XzMwMTEiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlGZWF0dXJlVW5pdF8zMDEyID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAxMiIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVJbnB1dFBvcnRfMzAxMyA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAxMyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUlucHV0UG9ydF8zMDE0ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMTQiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlPdXRwdXRQb3J0XzMwMTUgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uTXVsdGlPdXRwdXRQb3J0XzMwMTUiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlRmlsdGVyVW5pdF8zMDE2ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZUZpbHRlclVuaXRfMzAxNiIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUlucHV0UG9ydF8zMDE3ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMTciKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlT3V0cHV0UG9ydF8zMDE4ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZU91dHB1dFBvcnRfMzAxOCIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUZpbHRlclVuaXRfMzAxOSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzAxOSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUlucHV0UG9ydF8zMDIwID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMjAiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlPdXRwdXRQb3J0XzMwMjEgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uTXVsdGlPdXRwdXRQb3J0XzMwMjEiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlUXVldWVkVW5pdF8zMDIyID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMiIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVJbnB1dFBvcnRfMzAyMyA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAyMyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUlucHV0UG9ydF8zMDI0ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpSW5wdXRQb3J0XzMwMjQiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTZXF1ZW50aWFsVW5pdF8zMDI2ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNlcXVlbnRpYWxVbml0XzMwMjYiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlSW5wdXRQb3J0XzMwMjcgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMjciKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlJbnB1dFBvcnRfMzAyOCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDI4Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29uZGl0aW9uYWxVbml0XzMwMzAgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwMzAiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlSW5wdXRQb3J0XzMwMzEgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2luZ2xlSW5wdXRQb3J0XzMwMzEiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlJbnB1dFBvcnRfMzAzMiA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5NdWx0aUlucHV0UG9ydF8zMDMyIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIENhcnRlc2lhblF1ZXVlZFVuaXRfMzAzMyA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQXRvbWljVW5pdF8zMDM0ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzAzNCIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVJbnB1dFBvcnRfMzAzNSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVJbnB1dFBvcnRfMzAzNSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNiA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNiIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVGZWF0dXJlVW5pdF8zMDM4ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwMzgiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlGZWF0dXJlVW5pdF8zMDM5ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzAzOSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVGaWx0ZXJVbml0XzMwNDAgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDQwIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIE11bHRpRmlsdGVyVW5pdF8zMDQxID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpRmlsdGVyVW5pdF8zMDQxIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFNpbmdsZVF1ZXVlZFVuaXRfMzA0MiA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVRdWV1ZWRVbml0XzMwNDIiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2VxdWVudGlhbFVuaXRfMzA0NCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TZXF1ZW50aWFsVW5pdF8zMDQ0Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIENvbmRpdGlvbmFsVW5pdF8zMDQ2ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkNvbmRpdGlvbmFsVW5pdF8zMDQ2Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NyA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDciKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDggPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDgiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQXRvbWljVW5pdF8zMDQ5ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzA0OSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVGZWF0dXJlVW5pdF8zMDUwID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwNTAiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlGZWF0dXJlVW5pdF8zMDUxID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzA1MSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVGaWx0ZXJVbml0XzMwNTIgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDUyIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIE11bHRpRmlsdGVyVW5pdF8zMDUzID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpRmlsdGVyVW5pdF8zMDUzIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFNpbmdsZVF1ZXVlZFVuaXRfMzA1NCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVRdWV1ZWRVbml0XzMwNTQiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVGZWF0dXJlVW5pdF8zMDU1Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIE11bHRpRmVhdHVyZVVuaXRfMzA1NiA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5NdWx0aUZlYXR1cmVVbml0XzMwNTYiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlRmlsdGVyVW5pdF8zMDU3ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZUZpbHRlclVuaXRfMzA1NyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aUZpbHRlclVuaXRfMzA1OCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5NdWx0aUZpbHRlclVuaXRfMzA1OCIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVRdWV1ZWRVbml0XzMwNTkgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2luZ2xlUXVldWVkVW5pdF8zMDU5Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFNlcXVlbnRpYWxVbml0XzMwNjAgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA2MCIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVGZWF0dXJlVW5pdF8zMDYxID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlGZWF0dXJlVW5pdF8zMDYyID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpRmVhdHVyZVVuaXRfMzA2MiIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVGaWx0ZXJVbml0XzMwNjMgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2luZ2xlRmlsdGVyVW5pdF8zMDYzIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIE11bHRpRmlsdGVyVW5pdF8zMDY0ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpRmlsdGVyVW5pdF8zMDY0Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFNpbmdsZVF1ZXVlZFVuaXRfMzA2NSA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TaW5nbGVRdWV1ZWRVbml0XzMwNjUiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29uZGl0aW9uYWxVbml0XzMwNjYgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNjYiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2luZ2xlUXVldWVkVW5pdF8zMDY3ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NyIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBdG9taWNVbml0XzMwNjggPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uQXRvbWljVW5pdF8zMDY4Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFNlcXVlbnRpYWxVbml0XzMwNjkgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uU2VxdWVudGlhbFVuaXRfMzA2OSIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTZXF1ZW50aWFsVW5pdF8zMDcwID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNlcXVlbnRpYWxVbml0XzMwNzAiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29uZGl0aW9uYWxVbml0XzMwNzEgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNzEiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29uZGl0aW9uYWxVbml0XzMwNzIgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNzIiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgU2VxdWVudGlhbFVuaXRfMzA3MyA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5TZXF1ZW50aWFsVW5pdF8zMDczIik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEF0b21pY1VuaXRfMzA3NCA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwNzQiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29uZGl0aW9uYWxVbml0XzMwNzUgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uQ29uZGl0aW9uYWxVbml0XzMwNzUiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29uZGl0aW9uQ2hlY2tfMzA3NiA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5Db25kaXRpb25DaGVja18zMDc2Iik7IC8vJE5PTi1OTFMtMSQNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEF0b21pY1VuaXRfMzA3NyA9IGdldEVsZW1lbnRUeXBlKCJjb21yZWwuZGlhZ3JhbS5BdG9taWNVbml0XzMwNzciKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQXRvbWljVW5pdF8zMDc4ID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLkF0b21pY1VuaXRfMzA3OCIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTaW5nbGVQb3J0TWFwcGluZ180MDAxID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLlNpbmdsZVBvcnRNYXBwaW5nXzQwMDEiKTsgLy8kTk9OLU5MUy0xJA0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTXVsdGlQb3J0TWFwcGluZ180MDAyID0gZ2V0RWxlbWVudFR5cGUoImNvbXJlbC5kaWFncmFtLk11bHRpUG9ydE1hcHBpbmdfNDAwMiIpOyAvLyROT04tTkxTLTEkDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMgPSBnZXRFbGVtZW50VHlwZSgiY29tcmVsLmRpYWdyYW0uTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzIik7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsNCisJCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsNCisJCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsNCisJCX0NCisJCXJldHVybiBpbWFnZVJlZ2lzdHJ5Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW1hZ2VSZWdpc3RyeUtleShFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsNCisJCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKA0KKwkJCUVOYW1lZEVsZW1lbnQgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsNCisJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbGVtZW50KTsNCisJCQlFQ2xhc3MgZUNvbnRhaW5pbmdDbGFzcyA9IGZlYXR1cmUuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOw0KKwkJCUVDbGFzc2lmaWVyIGVUeXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOw0KKwkJCWlmIChlQ29udGFpbmluZ0NsYXNzICE9IG51bGwgJiYgIWVDb250YWluaW5nQ2xhc3MuaXNBYnN0cmFjdCgpKSB7DQorCQkJCWVsZW1lbnQgPSBlQ29udGFpbmluZ0NsYXNzOw0KKwkJCX0gZWxzZSBpZiAoZVR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MNCisJCQkJCSYmICEoKEVDbGFzcykgZVR5cGUpLmlzQWJzdHJhY3QoKSkgew0KKwkJCQllbGVtZW50ID0gZVR5cGU7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFQ2xhc3MpIHsNCisJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZWxlbWVudDsNCisJCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsNCisJCQkJcmV0dXJuIENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKA0KKwkJCQkJCQkJZUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpDQorCQkJCQkJCQkJCS5jcmVhdGUoZUNsYXNzKSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gVE9ETyA6IHN1cHBvcnQgc3RydWN0dXJhbCBmZWF0dXJlcw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsNCisJCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOw0KKwkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7DQorCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsNCisJCQlpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsNCisJCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsNCisJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsNCisJCQl9DQorCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7DQorCQl9DQorCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgew0KKwkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7DQorCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsNCisJCWlmIChpbWFnZSA9PSBudWxsKSB7DQorCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOw0KKwkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgew0KKwkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOw0KKwkJCX0NCisJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsNCisJCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsNCisJCX0NCisJCXJldHVybiBpbWFnZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKElBZGFwdGFibGUgaGludCkgew0KKwkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsNCisJCWlmIChlbGVtZW50ID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoSUFkYXB0YWJsZSBoaW50KSB7DQorCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOw0KKwkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGdldEltYWdlKGVsZW1lbnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zICd0eXBlJyBvZiB0aGUgZWNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGludC4NCisJICogDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgRU5hbWVkRWxlbWVudCBnZXRFbGVtZW50KElBZGFwdGFibGUgaGludCkgew0KKwkJT2JqZWN0IHR5cGUgPSBoaW50LmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsNCisJCWlmIChlbGVtZW50cyA9PSBudWxsKSB7DQorCQkJZWxlbWVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPElFbGVtZW50VHlwZSwgRU5hbWVkRWxlbWVudD4oKTsNCisNCisJCQllbGVtZW50cy5wdXQoQ29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJlZmFjdG9yaW5nKCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVJbnB1dFBvcnRfMjAwMSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoQ2FydGVzaWFuUXVldWVkVW5pdF8yMDAyLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZVF1ZXVlZFVuaXRfMjAwNCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNlcXVlbnRpYWxVbml0XzIwMDUsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoQ29uZGl0aW9uYWxVbml0XzIwMDYsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KEF0b21pY1VuaXRfMjAwNywNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUlucHV0UG9ydF8zMDAxLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChNdWx0aUlucHV0UG9ydF8zMDAyLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMywNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVJbnB1dFBvcnRfMzAwNSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoTXVsdGlJbnB1dFBvcnRfMzAwNiwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDcsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVGZWF0dXJlVW5pdF8zMDA4LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUlucHV0UG9ydF8zMDA5LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChNdWx0aUlucHV0UG9ydF8zMDEwLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZU91dHB1dFBvcnRfMzAxMSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZU91dHB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmVhdHVyZVVuaXRfMzAxMiwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUlucHV0UG9ydF8zMDEzLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChNdWx0aUlucHV0UG9ydF8zMDE0LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpT3V0cHV0UG9ydF8zMDE1LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlPdXRwdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVGaWx0ZXJVbml0XzMwMTYsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChNdWx0aUlucHV0UG9ydF8zMDE3LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZU91dHB1dFBvcnRfMzAxOCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZU91dHB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmlsdGVyVW5pdF8zMDE5LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChNdWx0aUlucHV0UG9ydF8zMDIwLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpT3V0cHV0UG9ydF8zMDIxLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlPdXRwdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVRdWV1ZWRVbml0XzMwMjIsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVJbnB1dFBvcnRfMzAyMywNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoTXVsdGlJbnB1dFBvcnRfMzAyNCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTZXF1ZW50aWFsVW5pdF8zMDI2LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUlucHV0UG9ydF8zMDI3LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlSW5wdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChNdWx0aUlucHV0UG9ydF8zMDI4LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlJbnB1dFBvcnQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KENhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KENvbmRpdGlvbmFsVW5pdF8zMDMwLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVJbnB1dFBvcnRfMzAzMSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoTXVsdGlJbnB1dFBvcnRfMzAzMiwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChBdG9taWNVbml0XzMwMzQsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVJbnB1dFBvcnRfMzAzNSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUlucHV0UG9ydCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVGZWF0dXJlVW5pdF8zMDM4LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmVhdHVyZVVuaXRfMzAzOSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUZpbHRlclVuaXRfMzA0MCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmlsdGVyVW5pdF8zMDQxLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVRdWV1ZWRVbml0XzMwNDIsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MywNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoU2VxdWVudGlhbFVuaXRfMzA0NCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoQ29uZGl0aW9uYWxVbml0XzMwNDYsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KENhcnRlc2lhblF1ZXVlZFVuaXRfMzA0NywNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChBdG9taWNVbml0XzMwNDksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVGZWF0dXJlVW5pdF8zMDUwLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmVhdHVyZVVuaXRfMzA1MSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUZpbHRlclVuaXRfMzA1MiwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmlsdGVyVW5pdF8zMDUzLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVRdWV1ZWRVbml0XzMwNTQsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVGZWF0dXJlVW5pdF8zMDU1LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmVhdHVyZVVuaXRfMzA1NiwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUZpbHRlclVuaXRfMzA1NywNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KE11bHRpRmlsdGVyVW5pdF8zMDU4LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVRdWV1ZWRVbml0XzMwNTksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTZXF1ZW50aWFsVW5pdF8zMDYwLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZUZlYXR1cmVVbml0XzMwNjEsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoTXVsdGlGZWF0dXJlVW5pdF8zMDYyLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoU2luZ2xlRmlsdGVyVW5pdF8zMDYzLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoTXVsdGlGaWx0ZXJVbml0XzMwNjQsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZVF1ZXVlZFVuaXRfMzA2NSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KENvbmRpdGlvbmFsVW5pdF8zMDY2LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTaW5nbGVRdWV1ZWRVbml0XzMwNjcsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChBdG9taWNVbml0XzMwNjgsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTZXF1ZW50aWFsVW5pdF8zMDY5LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNlcXVlbnRpYWxVbml0XzMwNzAsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdCgpKTsNCisNCisJCQllbGVtZW50cy5wdXQoQ29uZGl0aW9uYWxVbml0XzMwNzEsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KENvbmRpdGlvbmFsVW5pdF8zMDcyLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChTZXF1ZW50aWFsVW5pdF8zMDczLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KEF0b21pY1VuaXRfMzA3NCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KENvbmRpdGlvbmFsVW5pdF8zMDc1LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0KCkpOw0KKw0KKwkJCWVsZW1lbnRzLnB1dChDb25kaXRpb25DaGVja18zMDc2LA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uQ2hlY2soKSk7DQorDQorCQkJZWxlbWVudHMucHV0KEF0b21pY1VuaXRfMzA3NywNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KEF0b21pY1VuaXRfMzA3OCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKSk7DQorDQorCQkJZWxlbWVudHMucHV0KFNpbmdsZVBvcnRNYXBwaW5nXzQwMDEsDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVQb3J0TWFwcGluZygpKTsNCisNCisJCQllbGVtZW50cy5wdXQoTXVsdGlQb3J0TWFwcGluZ180MDAyLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlQb3J0TWFwcGluZygpKTsNCisNCisJCQllbGVtZW50cy5wdXQoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZygpKTsNCisJCX0NCisJCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoU3RyaW5nIGlkKSB7DQorCQlyZXR1cm4gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoaWQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLbm93bkVsZW1lbnRUeXBlKElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgew0KKwkJaWYgKEtOT1dOX0VMRU1FTlRfVFlQRVMgPT0gbnVsbCkgew0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMgPSBuZXcgSGFzaFNldDxJRWxlbWVudFR5cGU+KCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQ29tcG9zaXRlUmVmYWN0b3JpbmdfMTAwMCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMik7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZVF1ZXVlZFVuaXRfMjAwNCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2VxdWVudGlhbFVuaXRfMjAwNSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQ29uZGl0aW9uYWxVbml0XzIwMDYpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEF0b21pY1VuaXRfMjAwNyk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpSW5wdXRQb3J0XzMwMDIpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMyk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDcpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUZlYXR1cmVVbml0XzMwMDgpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUlucHV0UG9ydF8zMDA5KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aUlucHV0UG9ydF8zMDEwKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVPdXRwdXRQb3J0XzMwMTEpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpRmVhdHVyZVVuaXRfMzAxMik7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpSW5wdXRQb3J0XzMwMTQpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVGaWx0ZXJVbml0XzMwMTYpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZU91dHB1dFBvcnRfMzAxOCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTXVsdGlGaWx0ZXJVbml0XzMwMTkpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpT3V0cHV0UG9ydF8zMDIxKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVRdWV1ZWRVbml0XzMwMjIpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNlcXVlbnRpYWxVbml0XzMwMjYpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbmRpdGlvbmFsVW5pdF8zMDMwKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBdG9taWNVbml0XzMwMzQpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNik7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUZlYXR1cmVVbml0XzMwMzgpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpRmVhdHVyZVVuaXRfMzAzOSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlRmlsdGVyVW5pdF8zMDQwKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aUZpbHRlclVuaXRfMzA0MSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlUXVldWVkVW5pdF8zMDQyKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0Myk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2VxdWVudGlhbFVuaXRfMzA0NCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDcpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBdG9taWNVbml0XzMwNDkpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUZlYXR1cmVVbml0XzMwNTApOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpRmVhdHVyZVVuaXRfMzA1MSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlRmlsdGVyVW5pdF8zMDUyKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aUZpbHRlclVuaXRfMzA1Myk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVGZWF0dXJlVW5pdF8zMDU1KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aUZlYXR1cmVVbml0XzMwNTYpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZUZpbHRlclVuaXRfMzA1Nyk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTXVsdGlGaWx0ZXJVbml0XzMwNTgpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFNpbmdsZVF1ZXVlZFVuaXRfMzA1OSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2VxdWVudGlhbFVuaXRfMzA2MCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlRmVhdHVyZVVuaXRfMzA2MSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTXVsdGlGZWF0dXJlVW5pdF8zMDYyKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVGaWx0ZXJVbml0XzMwNjMpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKE11bHRpRmlsdGVyVW5pdF8zMDY0KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVRdWV1ZWRVbml0XzMwNjUpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbmRpdGlvbmFsVW5pdF8zMDY2KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTaW5nbGVRdWV1ZWRVbml0XzMwNjcpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEF0b21pY1VuaXRfMzA2OCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2VxdWVudGlhbFVuaXRfMzA2OSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2VxdWVudGlhbFVuaXRfMzA3MCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQ29uZGl0aW9uYWxVbml0XzMwNzEpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbmRpdGlvbmFsVW5pdF8zMDcyKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTZXF1ZW50aWFsVW5pdF8zMDczKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBdG9taWNVbml0XzMwNzQpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKENvbmRpdGlvbmFsVW5pdF8zMDc1KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChDb25kaXRpb25DaGVja18zMDc2KTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBdG9taWNVbml0XzMwNzcpOw0KKwkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEF0b21pY1VuaXRfMzA3OCk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSk7DQorCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoTXVsdGlQb3J0TWFwcGluZ180MDAyKTsNCisJCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMpOw0KKwkJfQ0KKwkJcmV0dXJuIEtOT1dOX0VMRU1FTlRfVFlQRVMuY29udGFpbnMoZWxlbWVudFR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElFbGVtZW50VHlwZSBnZXRFbGVtZW50VHlwZShpbnQgdmlzdWFsSUQpIHsNCisJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCWNhc2UgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIENvbXBvc2l0ZVJlZmFjdG9yaW5nXzEwMDA7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0XzIwMDE7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIENhcnRlc2lhblF1ZXVlZFVuaXRfMjAwMjsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXRfMjAwMzsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdF8yMDA0Ow0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXRfMjAwNTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBDb25kaXRpb25hbFVuaXRfMjAwNjsNCisJCWNhc2UgQXRvbWljVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQXRvbWljVW5pdF8yMDA3Ow0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnRfMzAwMTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0XzMwMDI7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDM7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdF8zMDA0Ow0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnRfMzAwNTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUlucHV0UG9ydF8zMDA2Ow0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3Ow0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXRfMzAwODsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0XzMwMDk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gTXVsdGlJbnB1dFBvcnRfMzAxMDsNCisJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlT3V0cHV0UG9ydF8zMDExOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0XzMwMTI7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydF8zMDEzOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0XzMwMTQ7DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gTXVsdGlPdXRwdXRQb3J0XzMwMTU7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXRfMzAxNjsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUlucHV0UG9ydF8zMDE3Ow0KKwkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlT3V0cHV0UG9ydF8zMDE4Ow0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdF8zMDE5Ow0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0XzMwMjA7DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpT3V0cHV0UG9ydF8zMDIxOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdF8zMDIyOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnRfMzAyMzsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUlucHV0UG9ydF8zMDI0Ow0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1Ow0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0XzMwMjY7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZUlucHV0UG9ydF8zMDI3Ow0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpSW5wdXRQb3J0XzMwMjg7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdF8zMDMwOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnRfMzAzMTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUlucHV0UG9ydF8zMDMyOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzOw0KKwkJY2FzZSBBdG9taWNVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQXRvbWljVW5pdF8zMDM0Ow0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVJbnB1dFBvcnRfMzAzNTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzY7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdF8zMDM3Ow0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0XzMwMzg7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0XzMwMzk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0XzMwNDA7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdF8zMDQxOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdF8zMDQyOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0MzsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTZXF1ZW50aWFsVW5pdF8zMDQ0Ow0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0XzMwNDY7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDc7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4Ow0KKwkJY2FzZSBBdG9taWNVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQXRvbWljVW5pdF8zMDQ5Ow0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0XzMwNTA7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0XzMwNTE7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0XzMwNTI7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdF8zMDUzOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdF8zMDU0Ow0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZUZlYXR1cmVVbml0XzMwNTU7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBNdWx0aUZlYXR1cmVVbml0XzMwNTY7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVGaWx0ZXJVbml0XzMwNTc7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpRmlsdGVyVW5pdF8zMDU4Ow0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdF8zMDU5Ow0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0XzMwNjA7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlRmVhdHVyZVVuaXRfMzA2MTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpRmVhdHVyZVVuaXRfMzA2MjsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZUZpbHRlclVuaXRfMzA2MzsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gTXVsdGlGaWx0ZXJVbml0XzMwNjQ7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBTaW5nbGVRdWV1ZWRVbml0XzMwNjU7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdF8zMDY2Ow0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2luZ2xlUXVldWVkVW5pdF8zMDY3Ow0KKwkJY2FzZSBBdG9taWNVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQXRvbWljVW5pdF8zMDY4Ow0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0XzMwNjk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gU2VxdWVudGlhbFVuaXRfMzA3MDsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQ29uZGl0aW9uYWxVbml0XzMwNzE7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdF8zMDcyOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNlcXVlbnRpYWxVbml0XzMwNzM7DQorCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBBdG9taWNVbml0XzMwNzQ7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIENvbmRpdGlvbmFsVW5pdF8zMDc1Ow0KKwkJY2FzZSBDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gQ29uZGl0aW9uQ2hlY2tfMzA3NjsNCisJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIEF0b21pY1VuaXRfMzA3NzsNCisJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIEF0b21pY1VuaXRfMzA3ODsNCisJCWNhc2UgU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIFNpbmdsZVBvcnRNYXBwaW5nXzQwMDE7DQorCQljYXNlIE11bHRpUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIE11bHRpUG9ydE1hcHBpbmdfNDAwMjsNCisJCWNhc2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gTXVsdGlTaW5nbGVQb3J0TWFwcGluZ180MDAzOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsSWNvblByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxJY29uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2VkNjQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsSWNvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByb3ZpZGVyczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5HZXRJY29uT3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5JSWNvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxJY29uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMNCisJCUlJY29uUHJvdmlkZXIgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEltYWdlIGdldEljb24oSUFkYXB0YWJsZSBoaW50LCBpbnQgZmxhZ3MpIHsNCisJCXJldHVybiBDb21yZWxFbGVtZW50VHlwZXMuZ2V0SW1hZ2UoaGludCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7DQorCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0SWNvbk9wZXJhdGlvbikgew0KKwkJCXJldHVybiAoKEdldEljb25PcGVyYXRpb24pIG9wZXJhdGlvbikuZXhlY3V0ZSh0aGlzKSAhPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbE1hcmtlck5hdmlnYXRpb25Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsTWFya2VyTmF2aWdhdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljZTJjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbE1hcmtlck5hdmlnYXRpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvdmlkZXJzLm1hcmtlci5BYnN0cmFjdE1vZGVsTWFya2VyTmF2aWdhdGlvblByb3ZpZGVyOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclV0aWw7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxNYXJrZXJOYXZpZ2F0aW9uUHJvdmlkZXIgZXh0ZW5kcw0KKwkJQWJzdHJhY3RNb2RlbE1hcmtlck5hdmlnYXRpb25Qcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfVFlQRSA9IENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQNCisJCQkrICIuZGlhZ25vc3RpYyI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvR290b01hcmtlcihJTWFya2VyIG1hcmtlcikgew0KKwkJU3RyaW5nIGVsZW1lbnRJZCA9IG1hcmtlcg0KKwkJCQkuZ2V0QXR0cmlidXRlKA0KKwkJCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnJlc291cmNlcy5JTWFya2VyLkVMRU1FTlRfSUQsDQorCQkJCQkJbnVsbCk7DQorCQlpZiAoZWxlbWVudElkID09IG51bGwgfHwgIShnZXRFZGl0b3IoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3IpKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoRGlhZ3JhbUVkaXRvcikgZ2V0RWRpdG9yKCk7DQorCQlNYXAgZWRpdFBhcnRSZWdpc3RyeSA9IGVkaXRvci5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkNCisJCQkJLmdldEVkaXRQYXJ0UmVnaXN0cnkoKTsNCisJCUVPYmplY3QgdGFyZ2V0VmlldyA9IGVkaXRvci5nZXREaWFncmFtKCkuZVJlc291cmNlKCkNCisJCQkJLmdldEVPYmplY3QoZWxlbWVudElkKTsNCisJCWlmICh0YXJnZXRWaWV3ID09IG51bGwpIHsNCisJCQlyZXR1cm47DQorCQl9DQorCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRSZWdpc3RyeS5nZXQodGFyZ2V0Vmlldyk7DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgIT0gbnVsbCkgew0KKwkJCUNvbXJlbERpYWdyYW1FZGl0b3JVdGlsLnNlbGVjdEVsZW1lbnRzSW5EaWFncmFtKGVkaXRvciwNCisJCQkJCUFycmF5cy5hc0xpc3QobmV3IEVkaXRQYXJ0W10geyB0YXJnZXRFZGl0UGFydCB9KSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSkgew0KKwkJdHJ5IHsNCisJCQlyZXNvdXJjZS5kZWxldGVNYXJrZXJzKE1BUktFUl9UWVBFLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiRmFpbGVkIHRvIGRlbGV0ZSB2YWxpZGF0aW9uIG1hcmtlcnMiLCBlKTsgLy8kTk9OLU5MUy0xJA0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElNYXJrZXIgYWRkTWFya2VyKElGaWxlIGZpbGUsIFN0cmluZyBlbGVtZW50SWQsDQorCQkJU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZSwgaW50IHN0YXR1c1NldmVyaXR5KSB7DQorCQlJTWFya2VyIG1hcmtlciA9IG51bGw7DQorCQl0cnkgew0KKwkJCW1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKE1BUktFUl9UWVBFKTsNCisJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7DQorCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBsb2NhdGlvbik7DQorCQkJbWFya2VyLnNldEF0dHJpYnV0ZSgNCisJCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5yZXNvdXJjZXMuSU1hcmtlci5FTEVNRU5UX0lELA0KKwkJCQkJZWxlbWVudElkKTsNCisJCQlpbnQgbWFya2VyU2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0lORk87DQorCQkJaWYgKHN0YXR1c1NldmVyaXR5ID09IElTdGF0dXMuV0FSTklORykgew0KKwkJCQltYXJrZXJTZXZlcml0eSA9IElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsNCisJCQl9IGVsc2UgaWYgKHN0YXR1c1NldmVyaXR5ID09IElTdGF0dXMuRVJST1INCisJCQkJCXx8IHN0YXR1c1NldmVyaXR5ID09IElTdGF0dXMuQ0FOQ0VMKSB7DQorCQkJCW1hcmtlclNldmVyaXR5ID0gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsNCisJCQl9DQorCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBtYXJrZXJTZXZlcml0eSk7DQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkiRmFpbGVkIHRvIGNyZWF0ZSB2YWxpZGF0aW9uIG1hcmtlciIsIGUpOyAvLyROT04tTkxTLTEkDQorCQl9DQorCQlyZXR1cm4gbWFya2VyOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzRhODIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTY5OSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByb3ZpZGVyczsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5tb2RlbGluZ2Fzc2lzdGFudC5Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy4qOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQorDQorLyoqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGV4dGVuZHMgTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclBvcHVwQmFyKElBZGFwdGFibGUgaG9zdCkgew0KKwkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdA0KKwkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOw0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzIwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8yMDAyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8yMDAzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMjAwNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8yMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8yMDA2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMjAwNyk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAxMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDE0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpT3V0cHV0UG9ydF8zMDE1KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDAxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDIpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwMik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQXRvbWljVW5pdDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzUpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDA2KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAwNik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDAyKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDA1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMDYpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMDkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDEzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMTUpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlT3V0cHV0UG9ydF8zMDE4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlPdXRwdXRQb3J0XzMwMjEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDIzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlGZWF0dXJlVW5pdDRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlRmlsdGVyVW5pdDRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAwOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDEwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZU91dHB1dFBvcnRfMzAxMSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMTMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAxNSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAxNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVPdXRwdXRQb3J0XzMwMTgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyMCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aU91dHB1dFBvcnRfMzAyMSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAyNCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDMyKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBdG9taWNVbml0NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAyNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUlucHV0UG9ydF8zMDI4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlSW5wdXRQb3J0XzMwMzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlJbnB1dFBvcnRfMzAzMik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDI3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMjgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDMxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpSW5wdXRQb3J0XzMwMzIpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEF0b21pY1VuaXQ2RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUlucHV0UG9ydF8zMDM1KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBdG9taWNVbml0N0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oMSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVJbnB1dFBvcnRfMzAzNSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMDgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwMjYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwMzApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMDgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDA0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDI2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDMwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzAzNCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDM4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAzOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNDApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDQyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDQ5KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMDgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDA0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDI2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDMwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzAzNCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNTUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDU2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNjYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMDgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDEyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzAxNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzAxOSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDA0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzAyMik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDI2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDMwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzAzNCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA2MSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNjIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDY0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMTIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwMjYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwMzApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDUyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1NCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDY5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3Nyk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMTIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwMjYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwMzApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDM4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAzOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNDApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDQ0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAzOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMzkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDQxKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA0NCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA0Nik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNDkpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDU3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDU4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNjYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDM4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAzOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNDApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDQ0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA2Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA2NCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDcwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAzOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMzkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDQwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDQxKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNDIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA0NCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA0Nik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNDkpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDUxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1Myk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc3KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQyRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzAwOCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwMTIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDE2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDE5KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDIyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwMjYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwMzApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDM0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDM4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzAzOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNDApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNDEpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDM3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA0Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDQ0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDQ2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA0OSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDU1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1Nik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNTkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2Nik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNjgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDU3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDU4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNjYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDY4KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA2MSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNjIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDYzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDY0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDY1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNzApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc0KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNTUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDU2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDVFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1OSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDYwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDY2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA2OCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3Nik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDUyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQzRWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAzMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNTQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2OSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzcpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3OCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDU1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA1Nik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNTcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNTgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNTkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA2Nik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNjgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDYxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA2Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDYxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA2Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDUxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1Myk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc3KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDUxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1Myk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc3KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGZWF0dXJlVW5pdF8zMDYxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmVhdHVyZVVuaXRfMzA2Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVGaWx0ZXJVbml0XzMwNjMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGaWx0ZXJVbml0XzMwNjQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyOSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3MSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzQpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbkNoZWNrXzMwNzYpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNTApOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDUxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1Myk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMzMpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDU0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNjkpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNzIpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDc3KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzA0Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNjcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA3Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzgpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwMzgpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDM5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA0MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA0MSk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0KSB7DQorCQkJQXJyYXlMaXN0PElFbGVtZW50VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5DYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMDcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuUGFyYWxsZWxRdWV1ZWRVbml0XzMwMzcpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlUXVldWVkVW5pdF8zMDQyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNlcXVlbnRpYWxVbml0XzMwNDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uYWxVbml0XzMwNDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQXRvbWljVW5pdF8zMDQ5KTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNTUpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDU2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA1Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA1OCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQzKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA1OSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDYwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDY2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA2OCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig0KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZlYXR1cmVVbml0XzMwNjEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuTXVsdGlGZWF0dXJlVW5pdF8zMDYyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZUZpbHRlclVuaXRfMzA2Myk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZpbHRlclVuaXRfMzA2NCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2NSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDcwKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDcxKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3NCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ29uZGl0aW9uQ2hlY2tfMzA3Nik7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmVhdHVyZVVuaXRfMzA1MCk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5NdWx0aUZlYXR1cmVVbml0XzMwNTEpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2luZ2xlRmlsdGVyVW5pdF8zMDUyKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLk11bHRpRmlsdGVyVW5pdF8zMDUzKTsNCisJCQlyZXR1cm4gdHlwZXM7DQorCQl9DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQpIHsNCisJCQlBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPig2KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNhcnRlc2lhblF1ZXVlZFVuaXRfMzAzMyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5QYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TaW5nbGVRdWV1ZWRVbml0XzMwNTQpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuU2VxdWVudGlhbFVuaXRfMzA2OSk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5Db25kaXRpb25hbFVuaXRfMzA3Mik7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5BdG9taWNVbml0XzMwNzcpOw0KKwkJCXJldHVybiB0eXBlczsNCisJCX0NCisJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydCkgew0KKwkJCUFycmF5TGlzdDxJRWxlbWVudFR5cGU+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KDYpOw0KKwkJCXR5cGVzLmFkZChDb21yZWxFbGVtZW50VHlwZXMuQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLlNpbmdsZVF1ZXVlZFVuaXRfMzA2Nyk7DQorCQkJdHlwZXMuYWRkKENvbXJlbEVsZW1lbnRUeXBlcy5TZXF1ZW50aWFsVW5pdF8zMDczKTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkNvbmRpdGlvbmFsVW5pdF8zMDc1KTsNCisJCQl0eXBlcy5hZGQoQ29tcmVsRWxlbWVudFR5cGVzLkF0b21pY1VuaXRfMzA3OCk7DQorCQkJcmV0dXJuIHR5cGVzOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2UoSUFkYXB0YWJsZSBzb3VyY2UpIHsNCisJCUlHcmFwaGljYWxFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIHNvdXJjZQ0KKwkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOw0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnRFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2UoKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2UoKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2UoKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDVFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2UoKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2UoKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ2RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDlFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlKCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ5RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZSgpOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25UYXJnZXQoSUFkYXB0YWJsZSB0YXJnZXQpIHsNCisJCUlHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIHRhcmdldA0KKwkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOw0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnRFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uVGFyZ2V0KCk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblRhcmdldCgpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0RWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblRhcmdldCgpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25UYXJnZXQoKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblRhcmdldCgpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NEVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25UYXJnZXQoKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblRhcmdldCgpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25UYXJnZXQoKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblRhcmdldCgpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uVGFyZ2V0KCk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25UYXJnZXQoKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uVGFyZ2V0KCk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25UYXJnZXQoKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uVGFyZ2V0KCk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25UYXJnZXQoKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uVGFyZ2V0KCk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25UYXJnZXQoKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uVGFyZ2V0KCk7DQorCQl9DQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwNCisJCQlJQWRhcHRhYmxlIHRhcmdldCkgew0KKwkJSUdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgc291cmNlDQorCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7DQorCQlJR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSB0YXJnZXQNCisJCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsNCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KHRhcmdldEVkaXRQYXJ0KTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KHRhcmdldEVkaXRQYXJ0KTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KHRhcmdldEVkaXRQYXJ0KTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KHRhcmdldEVkaXRQYXJ0KTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFSZWxUeXBlc09uU291cmNlQW5kVGFyZ2V0KHRhcmdldEVkaXRQYXJ0KTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BUmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldCh0YXJnZXRFZGl0UGFydCk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQodGFyZ2V0RWRpdFBhcnQpOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LA0KKwkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlJR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSB0YXJnZXQNCisJCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsNCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JTb3VyY2UocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JTb3VyY2UocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclNvdXJjZShyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclNvdXJjZShyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JTb3VyY2UocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JTb3VyY2UocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yU291cmNlKHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yU291cmNlKHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclNvdXJjZShyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JTb3VyY2UocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yU291cmNlKHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yU291cmNlKHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclNvdXJjZShyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgdGFyZ2V0RWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclNvdXJjZShyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JTb3VyY2UocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHRhcmdldEVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JTb3VyY2UocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAodGFyZ2V0RWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yU291cmNlKHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB0YXJnZXRFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yU291cmNlKHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLA0KKwkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7DQorCQlJR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBzb3VyY2UNCisJCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsNCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnRFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclRhcmdldChyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclRhcmdldChyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDNFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlT3V0cHV0UG9ydEVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDRFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclRhcmdldChyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlPdXRwdXRQb3J0RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDVFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDZFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlPdXRwdXRQb3J0MkVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChNdWx0aUlucHV0UG9ydDdFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclRhcmdldChyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKFNpbmdsZUlucHV0UG9ydDdFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpDQorCQkJCQkuZ2V0TUFUeXBlc0ZvclRhcmdldChyZWxhdGlvbnNoaXBUeXBlKTsNCisJCX0NCisJCWlmIChzb3VyY2VFZGl0UGFydCBpbnN0YW5jZW9mIE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHsNCisJCQlyZXR1cm4gKChTaW5nbGVJbnB1dFBvcnQ4RWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQ0KKwkJCQkJLmdldE1BVHlwZXNGb3JUYXJnZXQocmVsYXRpb25zaGlwVHlwZSk7DQorCQl9DQorCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBNdWx0aUlucHV0UG9ydDlFZGl0UGFydCkgew0KKwkJCXJldHVybiAoKE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSB7DQorCQkJcmV0dXJuICgoU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0KSBzb3VyY2VFZGl0UGFydCkNCisJCQkJCS5nZXRNQVR5cGVzRm9yVGFyZ2V0KHJlbGF0aW9uc2hpcFR5cGUpOw0KKwkJfQ0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwNCisJCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgew0KKwkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudCh0YXJnZXQsDQorCQkJCWdldFR5cGVzRm9yU291cmNlKHRhcmdldCwgcmVsYXRpb25zaGlwVHlwZSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsDQorCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsNCisJCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoc291cmNlLA0KKwkJCQlnZXRUeXBlc0ZvclRhcmdldChzb3VyY2UsIHJlbGF0aW9uc2hpcFR5cGUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50KElBZGFwdGFibGUgaG9zdCwgQ29sbGVjdGlvbiB0eXBlcykgew0KKwkJaWYgKHR5cGVzLmlzRW1wdHkoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdA0KKwkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOw0KKwkJaWYgKGVkaXRQYXJ0ID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRSb290KCkuZ2V0Q29udGVudHMoKS5nZXRNb2RlbCgpOw0KKwkJSGFzaFNldDxFT2JqZWN0PiBlbGVtZW50cyA9IG5ldyBIYXNoU2V0PEVPYmplY3Q+KCk7DQorCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ID0gZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFsbENvbnRlbnRzKCk7IGl0DQorCQkJCS5oYXNOZXh0KCk7KSB7DQorCQkJRU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOw0KKwkJCWlmIChpc0FwcGxpY2FibGVFbGVtZW50KGVsZW1lbnQsIHR5cGVzKSkgew0KKwkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIHNlbGVjdEVsZW1lbnQoKEVPYmplY3RbXSkgZWxlbWVudHMudG9BcnJheShuZXcgRU9iamVjdFtlbGVtZW50cw0KKwkJCQkuc2l6ZSgpXSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGVFbGVtZW50KEVPYmplY3QgZWxlbWVudCwgQ29sbGVjdGlvbiB0eXBlcykgew0KKwkJSUVsZW1lbnRUeXBlIHR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudFR5cGUoDQorCQkJCWVsZW1lbnQpOw0KKwkJcmV0dXJuIHR5cGVzLmNvbnRhaW5zKHR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFbGVtZW50KEVPYmplY3RbXSBlbGVtZW50cykgew0KKwkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOw0KKwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoDQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSk7DQorCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coDQorCQkJCXNoZWxsLCBsYWJlbFByb3ZpZGVyKTsNCisJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkNvbXJlbE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJNZXNzYWdlKTsNCisJCWRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5Db21yZWxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyVGl0bGUpOw0KKwkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsNCisJCWRpYWxvZy5zZXRFbGVtZW50cyhlbGVtZW50cyk7DQorCQlFT2JqZWN0IHNlbGVjdGVkID0gbnVsbDsNCisJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgew0KKwkJCXNlbGVjdGVkID0gKEVPYmplY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOw0KKwkJfQ0KKwkJcmV0dXJuIHNlbGVjdGVkOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbFBhcnNlclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxQYXJzZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOWZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxQYXJzZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjI2MSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByb3ZpZGVyczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuR2V0UGFyc2VyT3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlclByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlMkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdExhYmVsVHlwZTRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlNUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkF0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQXRvbWljVW5pdExhYmVsVHlwZTdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5BdG9taWNVbml0TGFiZWxUeXBlRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5DYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLk11bHRpSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5NdWx0aUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5QYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU2RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5TaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnNlcnMuTWVzc2FnZUZvcm1hdFBhcnNlcjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsUGFyc2VyUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMNCisJCUlQYXJzZXJQcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAwMVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDAxUGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDFQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDAxUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDFQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MFBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MFBhcnNlcigpIHsNCisJCWlmIChjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQljYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MFBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwODFQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MVBhcnNlcigpIHsNCisJCWlmIChwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDgxUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDgxUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwODFQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MlBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MlBhcnNlcigpIHsNCisJCWlmIChzaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MlBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MlBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBzaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4MlBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4M1BhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwODNQYXJzZXIoKSB7DQorCQlpZiAoc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDgzUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDgzUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA4M1BhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwODRQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0Q29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA4NFBhcnNlcigpIHsNCisJCWlmIChjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDg0UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQljb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDg0UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwODRQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBhdG9taWNVbml0TGFiZWxUeXBlXzUwODVQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0QXRvbWljVW5pdExhYmVsVHlwZV81MDg1UGFyc2VyKCkgew0KKwkJaWYgKGF0b21pY1VuaXRMYWJlbFR5cGVfNTA4NVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X0xhYmVsKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJYXRvbWljVW5pdExhYmVsVHlwZV81MDg1UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGF0b21pY1VuaXRMYWJlbFR5cGVfNTA4NVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDJQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAwMlBhcnNlcigpIHsNCisJCWlmIChzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDAyUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAwMlBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDAyUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgbXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDAzUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldE11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAwM1BhcnNlcigpIHsNCisJCWlmIChtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMDNQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQltdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMDNQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gbXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDAzUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzlQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzlQYXJzZXIoKSB7DQorCQlpZiAoY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzlQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzlQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzlQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc4UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzhQYXJzZXIoKSB7DQorCQlpZiAocGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3OFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3OFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc4UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAwNFBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDA0UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDRQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDA0UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDRQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMDVQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDA1UGFyc2VyKCkgew0KKwkJaWYgKG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAwNVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAwNVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMDVQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3N1BhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3N1BhcnNlcigpIHsNCisJCWlmIChjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3N1BhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQljYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3N1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3N1BhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTAwOVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMDlQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDA5UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTAwOVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMDlQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDA2UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDZQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAwNlBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDZQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAwNlBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAwN1BhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRNdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMDdQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDA3UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDA3UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAwN1BhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZU91dHB1dFBvcnROYW1lVHlwZV81MDA4UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZU91dHB1dFBvcnROYW1lVHlwZV81MDA4UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZU91dHB1dFBvcnROYW1lVHlwZV81MDA4UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlXzUwMDhQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlXzUwMDhQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTAxM1BhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTAxM1BhcnNlcigpIHsNCisJCWlmIChtdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTAxM1BhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpRmVhdHVyZVVuaXROYW1lVHlwZV81MDEzUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIG11bHRpRmVhdHVyZVVuaXROYW1lVHlwZV81MDEzUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAxMFBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDEwUGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMTBQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDEwUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMTBQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMTFQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDExUGFyc2VyKCkgew0KKwkJaWYgKG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAxMVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAxMVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMTFQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aU91dHB1dFBvcnROYW1lVHlwZV81MDEyUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlXzUwMTJQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVfNTAxMlBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpT3V0cHV0UG9ydE5hbWVUeXBlXzUwMTJQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gbXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVfNTAxMlBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDE2UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDE2UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDE2UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwMTZQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwMTZQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMTRQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDE0UGFyc2VyKCkgew0KKwkJaWYgKG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAxNFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAxNFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMTRQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVfNTAxNVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVfNTAxNVBhcnNlcigpIHsNCisJCWlmIChzaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVfNTAxNVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZU91dHB1dFBvcnROYW1lVHlwZV81MDE1UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZU91dHB1dFBvcnROYW1lVHlwZV81MDE1UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgbXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTAxOVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRNdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDE5UGFyc2VyKCkgew0KKwkJaWYgKG11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwMTlQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwMTlQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gbXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTAxOVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAxN1BhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRNdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMTdQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDE3UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDE3UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAxN1BhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIG11bHRpT3V0cHV0UG9ydE5hbWVUeXBlXzUwMThQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVfNTAxOFBhcnNlcigpIHsNCisJCWlmIChtdWx0aU91dHB1dFBvcnROYW1lVHlwZV81MDE4UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVfNTAxOFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aU91dHB1dFBvcnROYW1lVHlwZV81MDE4UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzZQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzZQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzZQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzZQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzZQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDIwUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjBQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyMFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjBQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyMFBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyMVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRNdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMjFQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDIxUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDIxUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyMVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc1UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc1UGFyc2VyKCkgew0KKwkJaWYgKGNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc1UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc1UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc1UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc0UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3NFBhcnNlcigpIHsNCisJCWlmIChzZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzRQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlzZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzRQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc0UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyMlBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDIyUGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjJQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDIyUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjJQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMjNQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDIzUGFyc2VyKCkgew0KKwkJaWYgKG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyM1BhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyM1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMjNQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3M1BhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3M1BhcnNlcigpIHsNCisJCWlmIChjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3M1BhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQljYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3M1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3M1BhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNzJQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0Q29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA3MlBhcnNlcigpIHsNCisJCWlmIChjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDcyUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQljb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDcyUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNzJQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDI0UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjRQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyNFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjRQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyNFBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyNVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRNdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMjVQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDI1UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDI1UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIG11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyNVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDI4UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDI4UGFyc2VyKCkgew0KKwkJaWYgKGNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDI4UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDI4UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDI4UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgYXRvbWljVW5pdExhYmVsVHlwZV81MDI3UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldEF0b21pY1VuaXRMYWJlbFR5cGVfNTAyN1BhcnNlcigpIHsNCisJCWlmIChhdG9taWNVbml0TGFiZWxUeXBlXzUwMjdQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9MYWJlbCgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWF0b21pY1VuaXRMYWJlbFR5cGVfNTAyN1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBhdG9taWNVbml0TGFiZWxUeXBlXzUwMjdQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDI2UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjZQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyNlBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjZQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyNlBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzFQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3MVBhcnNlcigpIHsNCisJCWlmIChwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDcxUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDcxUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzFQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDcwUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzBQYXJzZXIoKSB7DQorCQlpZiAocGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3MFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3MFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDcwUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDI5UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTAyOVBhcnNlcigpIHsNCisJCWlmIChzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMjlQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDI5UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTAyOVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIG11bHRpRmVhdHVyZVVuaXROYW1lVHlwZV81MDMwUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZV81MDMwUGFyc2VyKCkgew0KKwkJaWYgKG11bHRpRmVhdHVyZVVuaXROYW1lVHlwZV81MDMwUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzBQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gbXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzBQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVfNTAzMVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVfNTAzMVBhcnNlcigpIHsNCisJCWlmIChzaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVfNTAzMVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDMxUGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDMxUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgbXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTAzMlBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRNdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDMyUGFyc2VyKCkgew0KKwkJaWYgKG11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwMzJQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCW11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwMzJQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gbXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTAzMlBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY5UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY5UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY5UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY5UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY5UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgcGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2OFBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY4UGFyc2VyKCkgew0KKwkJaWYgKHBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjhQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjhQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gcGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2OFBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2N1BhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjdQYXJzZXIoKSB7DQorCQlpZiAoc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY3UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY3UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2N1BhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjZQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2NlBhcnNlcigpIHsNCisJCWlmIChwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY2UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY2UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjZQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDY1UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNjVQYXJzZXIoKSB7DQorCQlpZiAoY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA2NVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA2NVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDY1UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwMzNQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwMzNQYXJzZXIoKSB7DQorCQlpZiAoY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwMzNQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwMzNQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gY2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwMzNQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDM1UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwMzVQYXJzZXIoKSB7DQorCQlpZiAocGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTAzNVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTAzNVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBwYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDM1UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgYXRvbWljVW5pdExhYmVsVHlwZV81MDM0UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldEF0b21pY1VuaXRMYWJlbFR5cGVfNTAzNFBhcnNlcigpIHsNCisJCWlmIChhdG9taWNVbml0TGFiZWxUeXBlXzUwMzRQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9MYWJlbCgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWF0b21pY1VuaXRMYWJlbFR5cGVfNTAzNFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBhdG9taWNVbml0TGFiZWxUeXBlXzUwMzRQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzZQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDM2UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTAzNlBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzZQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDM2UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgbXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzdQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzdQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzdQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQltdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTAzN1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTAzN1BhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDM4UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDM4UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDM4UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwMzhQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwMzhQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDM5UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwMzlQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTAzOVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTAzOVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDM5UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjRQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjRQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjRQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjRQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjRQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDBQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDQwUGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0MFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDBQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDQwUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgbXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDFQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDFQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDFQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQltdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0MVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0MVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDQyUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDQyUGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDQyUGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwNDJQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwNDJQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDQzUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwNDNQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTA0M1BhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTA0M1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDQzUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjNQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjNQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjNQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjNQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjNQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjJQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDYyUGFyc2VyKCkgew0KKwkJaWYgKHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2MlBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfTGJsU3RyaWN0KCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2MlBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBzZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjJQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDRQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDQ0UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0NFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDRQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDQ0UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgbXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDVQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0TXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDVQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwNDVQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQltdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0NVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0NVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDQ2UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDQ2UGFyc2VyKCkgew0KKwkJaWYgKHNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDQ2UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwNDZQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwNDZQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBtdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDQ3UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwNDdQYXJzZXIoKSB7DQorCQlpZiAobXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTA0N1BhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJbXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTA0N1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBtdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDQ3UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjFQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjFQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjFQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjFQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjFQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDYwUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNjBQYXJzZXIoKSB7DQorCQlpZiAoY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA2MFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA2MFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDYwUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNDlQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNDlQYXJzZXIoKSB7DQorCQlpZiAoc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNDlQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXRfVHlwZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNDlQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNDlQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBhdG9taWNVbml0TGFiZWxUeXBlXzUwNDhQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0QXRvbWljVW5pdExhYmVsVHlwZV81MDQ4UGFyc2VyKCkgew0KKwkJaWYgKGF0b21pY1VuaXRMYWJlbFR5cGVfNTA0OFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X0xhYmVsKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJYXRvbWljVW5pdExhYmVsVHlwZV81MDQ4UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGF0b21pY1VuaXRMYWJlbFR5cGVfNTA0OFBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA1OVBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNTlQYXJzZXIoKSB7DQorCQlpZiAoc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDU5UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDU5UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA1OVBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA1OFBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNThQYXJzZXIoKSB7DQorCQlpZiAoc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDU4UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9UeXBlKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9MYmxTdHJpY3QoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDU4UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIHNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA1OFBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNTdQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0Q29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA1N1BhcnNlcigpIHsNCisJCWlmIChjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU3UGFyc2VyID09IG51bGwpIHsNCisJCQlFQXR0cmlidXRlW10gZmVhdHVyZXMgPSBuZXcgRUF0dHJpYnV0ZVtdIHsNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfVHlwZSgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQljb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU3UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNTdQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU2UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNTZQYXJzZXIoKSB7DQorCQlpZiAoY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA1NlBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA1NlBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU2UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDUxUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA1MVBhcnNlcigpIHsNCisJCWlmIChzZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNTFQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0xibFN0cmljdCgpIH07DQorCQkJTWVzc2FnZUZvcm1hdFBhcnNlciBwYXJzZXIgPSBuZXcgTWVzc2FnZUZvcm1hdFBhcnNlcihmZWF0dXJlcyk7DQorCQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdG9yUGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH06ezF9IC17Mn0tIik7IC8vJE5PTi1OTFMtMSQNCisJCQlzZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNTFQYXJzZXIgPSBwYXJzZXI7DQorCQl9DQorCQlyZXR1cm4gc2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDUxUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgYXRvbWljVW5pdExhYmVsVHlwZV81MDUwUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldEF0b21pY1VuaXRMYWJlbFR5cGVfNTA1MFBhcnNlcigpIHsNCisJCWlmIChhdG9taWNVbml0TGFiZWxUeXBlXzUwNTBQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9MYWJlbCgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWF0b21pY1VuaXRMYWJlbFR5cGVfNTA1MFBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBhdG9taWNVbml0TGFiZWxUeXBlXzUwNTBQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU1UGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNTVQYXJzZXIoKSB7DQorCQlpZiAoY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA1NVBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJY29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA1NVBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU1UGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgY29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNfNTA1MlBhcnNlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBnZXRDb25kaXRpb25DaGVja05hbWVUeXBlU3BlY181MDUyUGFyc2VyKCkgew0KKwkJaWYgKGNvbmRpdGlvbkNoZWNrTmFtZVR5cGVTcGVjXzUwNTJQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbkNoZWNrX1R5cGUoKSwNCisJCQkJCUNvbXJlbFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmRpdGlvbkNoZWNrX1NwZWMoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0gLXsyfS0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSAtezJ9LSIpOyAvLyROT04tTkxTLTEkDQorCQkJY29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNfNTA1MlBhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBjb25kaXRpb25DaGVja05hbWVUeXBlU3BlY181MDUyUGFyc2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgYXRvbWljVW5pdExhYmVsVHlwZV81MDUzUGFyc2VyOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJUGFyc2VyIGdldEF0b21pY1VuaXRMYWJlbFR5cGVfNTA1M1BhcnNlcigpIHsNCisJCWlmIChhdG9taWNVbml0TGFiZWxUeXBlXzUwNTNQYXJzZXIgPT0gbnVsbCkgew0KKwkJCUVBdHRyaWJ1dGVbXSBmZWF0dXJlcyA9IG5ldyBFQXR0cmlidXRlW10gew0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9MYWJlbCgpLA0KKwkJCQkJQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9UeXBlKCkgfTsNCisJCQlNZXNzYWdlRm9ybWF0UGFyc2VyIHBhcnNlciA9IG5ldyBNZXNzYWdlRm9ybWF0UGFyc2VyKGZlYXR1cmVzKTsNCisJCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0b3JQYXR0ZXJuKCJ7MH06ezF9Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCWF0b21pY1VuaXRMYWJlbFR5cGVfNTA1M1BhcnNlciA9IHBhcnNlcjsNCisJCX0NCisJCXJldHVybiBhdG9taWNVbml0TGFiZWxUeXBlXzUwNTNQYXJzZXI7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSVBhcnNlciBhdG9taWNVbml0TGFiZWxUeXBlXzUwNTRQYXJzZXI7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIElQYXJzZXIgZ2V0QXRvbWljVW5pdExhYmVsVHlwZV81MDU0UGFyc2VyKCkgew0KKwkJaWYgKGF0b21pY1VuaXRMYWJlbFR5cGVfNTA1NFBhcnNlciA9PSBudWxsKSB7DQorCQkJRUF0dHJpYnV0ZVtdIGZlYXR1cmVzID0gbmV3IEVBdHRyaWJ1dGVbXSB7DQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X0xhYmVsKCksDQorCQkJCQlDb21yZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdG9taWNVbml0X1R5cGUoKSB9Ow0KKwkJCU1lc3NhZ2VGb3JtYXRQYXJzZXIgcGFyc2VyID0gbmV3IE1lc3NhZ2VGb3JtYXRQYXJzZXIoZmVhdHVyZXMpOw0KKwkJCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJcGFyc2VyLnNldEVkaXRvclBhdHRlcm4oInswfTp7MX0iKTsgLy8kTk9OLU5MUy0xJA0KKwkJCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9OnsxfSIpOyAvLyROT04tTkxTLTEkDQorCQkJYXRvbWljVW5pdExhYmVsVHlwZV81MDU0UGFyc2VyID0gcGFyc2VyOw0KKwkJfQ0KKwkJcmV0dXJuIGF0b21pY1VuaXRMYWJlbFR5cGVfNTA1NFBhcnNlcjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElQYXJzZXIgZ2V0UGFyc2VyKGludCB2aXN1YWxJRCkgew0KKwkJc3dpdGNoICh2aXN1YWxJRCkgew0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAwMVBhcnNlcigpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDgwUGFyc2VyKCk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDgxUGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwODJQYXJzZXIoKTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDgzUGFyc2VyKCk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDg0UGFyc2VyKCk7DQorCQljYXNlIEF0b21pY1VuaXRMYWJlbFR5cGVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRMYWJlbFR5cGVfNTA4NVBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDJQYXJzZXIoKTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDAzUGFyc2VyKCk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc5UGFyc2VyKCk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3OFBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMDRQYXJzZXIoKTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAwNVBhcnNlcigpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3N1BhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMDlQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnROYW1lVHlwZV81MDA2UGFyc2VyKCk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUlucHV0UG9ydE5hbWVUeXBlXzUwMDdQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVfNTAwOFBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZV81MDEzUGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAxMFBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDExUGFyc2VyKCk7DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aU91dHB1dFBvcnROYW1lVHlwZV81MDEyUGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwMTZQYXJzZXIoKTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAxNFBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVfNTAxNVBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTAxOVBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDE3UGFyc2VyKCk7DQorCQljYXNlIE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVfNTAxOFBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3NlBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjBQYXJzZXIoKTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyMVBhcnNlcigpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA3NVBhcnNlcigpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDc0UGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyMlBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlJbnB1dFBvcnROYW1lVHlwZV81MDIzUGFyc2VyKCk7DQorCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDczUGFyc2VyKCk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA3MlBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlXzUwMjRQYXJzZXIoKTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0TmFtZVR5cGVfNTAyNVBhcnNlcigpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTAyOFBhcnNlcigpOw0KKwkJY2FzZSBBdG9taWNVbml0TGFiZWxUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0QXRvbWljVW5pdExhYmVsVHlwZV81MDI3UGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVfNTAyNlBhcnNlcigpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNzFQYXJzZXIoKTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDcwUGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMjlQYXJzZXIoKTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlXzUwMzBQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlXzUwMzFQYXJzZXIoKTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZpbHRlclVuaXROYW1lVHlwZV81MDMyUGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY5UGFyc2VyKCk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2OFBhcnNlcigpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDY3UGFyc2VyKCk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0UGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2NlBhcnNlcigpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNjVQYXJzZXIoKTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwMzNQYXJzZXIoKTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdF81MDM1UGFyc2VyKCk7DQorCQljYXNlIEF0b21pY1VuaXRMYWJlbFR5cGUzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0TGFiZWxUeXBlXzUwMzRQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTAzNlBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTAzN1BhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVfNTAzOFBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwMzlQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjRQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0MFBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVfNTA0MVBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGVfNTA0MlBhcnNlcigpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlXzUwNDNQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNjNQYXJzZXIoKTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2MlBhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZV81MDQ0UGFyc2VyKCk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZV81MDQ1UGFyc2VyKCk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZV81MDQ2UGFyc2VyKCk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0TXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVfNTA0N1BhcnNlcigpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RfNTA2MVBhcnNlcigpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlXzUwNjBQYXJzZXIoKTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNDlQYXJzZXIoKTsNCisJCWNhc2UgQXRvbWljVW5pdExhYmVsVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRMYWJlbFR5cGVfNTA0OFBhcnNlcigpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDU5UGFyc2VyKCk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0XzUwNThQYXJzZXIoKTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU3UGFyc2VyKCk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0Q29uZGl0aW9uYWxVbml0TmFtZVR5cGVfNTA1NlBhcnNlcigpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gZ2V0U2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdF81MDUxUGFyc2VyKCk7DQorCQljYXNlIEF0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0TGFiZWxUeXBlXzUwNTBQYXJzZXIoKTsNCisJCWNhc2UgQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25hbFVuaXROYW1lVHlwZV81MDU1UGFyc2VyKCk7DQorCQljYXNlIENvbmRpdGlvbkNoZWNrTmFtZVR5cGVTcGVjRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRDb25kaXRpb25DaGVja05hbWVUeXBlU3BlY181MDUyUGFyc2VyKCk7DQorCQljYXNlIEF0b21pY1VuaXRMYWJlbFR5cGU2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBnZXRBdG9taWNVbml0TGFiZWxUeXBlXzUwNTNQYXJzZXIoKTsNCisJCWNhc2UgQXRvbWljVW5pdExhYmVsVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGdldEF0b21pY1VuaXRMYWJlbFR5cGVfNTA1NFBhcnNlcigpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY29uc3VsdHMgUGFyc2VyU2VydmljZQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIElQYXJzZXIgZ2V0UGFyc2VyKElFbGVtZW50VHlwZSB0eXBlLCBFT2JqZWN0IG9iamVjdCwNCisJCQlTdHJpbmcgcGFyc2VySGludCkgew0KKwkJcmV0dXJuIFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoDQorCQkJCW5ldyBIaW50QWRhcHRlcih0eXBlLCBvYmplY3QsIHBhcnNlckhpbnQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKElBZGFwdGFibGUgaGludCkgew0KKwkJU3RyaW5nIHZpZCA9IChTdHJpbmcpIGhpbnQuZ2V0QWRhcHRlcihTdHJpbmcuY2xhc3MpOw0KKwkJaWYgKHZpZCAhPSBudWxsKSB7DQorCQkJcmV0dXJuIGdldFBhcnNlcihDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZCkpOw0KKwkJfQ0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGhpbnQuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsNCisJCWlmICh2aWV3ICE9IG51bGwpIHsNCisJCQlyZXR1cm4gZ2V0UGFyc2VyKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7DQorCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UGFyc2VyT3BlcmF0aW9uKSB7DQorCQkJSUFkYXB0YWJsZSBoaW50ID0gKChHZXRQYXJzZXJPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0SGludCgpOw0KKwkJCWlmIChDb21yZWxFbGVtZW50VHlwZXMuZ2V0RWxlbWVudChoaW50KSA9PSBudWxsKSB7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQkJcmV0dXJuIGdldFBhcnNlcihoaW50KSAhPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBIaW50QWRhcHRlciBleHRlbmRzIFBhcnNlckhpbnRBZGFwdGVyIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIGZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZTsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgSGludEFkYXB0ZXIoSUVsZW1lbnRUeXBlIHR5cGUsIEVPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcGFyc2VySGludCkgew0KKwkJCXN1cGVyKG9iamVjdCwgcGFyc2VySGludCk7DQorCQkJYXNzZXJ0IHR5cGUgIT0gbnVsbDsNCisJCQllbGVtZW50VHlwZSA9IHR5cGU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsNCisJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgew0KKwkJCQlyZXR1cm4gZWxlbWVudFR5cGU7DQorCQkJfQ0KKwkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbFNob3J0Y3V0c0RlY29yYXRvclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxTaG9ydGN1dHNEZWNvcmF0b3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2QwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxTaG9ydGN1dHNEZWNvcmF0b3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmRpYWdyYW0ucHJvdmlkZXJzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25FZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVFZGl0UGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5kZWNvcmF0b3IuQWJzdHJhY3REZWNvcmF0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZGVjb3JhdG9yLkNyZWF0ZURlY29yYXRvcnNPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZGVjb3JhdG9yLklEZWNvcmF0b3JQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5zZXJ2aWNlcy5kZWNvcmF0b3IuSURlY29yYXRvclRhcmdldDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KKw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5lZGl0LnBhcnRzLkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQ7DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsU2hvcnRjdXRzRGVjb3JhdG9yUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyDQorCQlpbXBsZW1lbnRzIElEZWNvcmF0b3JQcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVENVVFNfREVDT1JBVE9SX0lEID0gInNob3J0Y3V0cyI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7DQorCQlpZiAoIShvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVEZWNvcmF0b3JzT3BlcmF0aW9uKSkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCUlEZWNvcmF0b3JUYXJnZXQgZGVjb3JhdG9yVGFyZ2V0ID0gKChDcmVhdGVEZWNvcmF0b3JzT3BlcmF0aW9uKSBvcGVyYXRpb24pDQorCQkJCS5nZXREZWNvcmF0b3JUYXJnZXQoKTsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBkZWNvcmF0b3JUYXJnZXQuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsNCisJCXJldHVybiB2aWV3ICE9IG51bGwNCisJCQkJJiYgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRA0KKwkJCQkJCS5lcXVhbHMoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlRGVjb3JhdG9ycyhJRGVjb3JhdG9yVGFyZ2V0IGRlY29yYXRvclRhcmdldCkgew0KKwkJVmlldyB2aWV3ID0gKFZpZXcpIGRlY29yYXRvclRhcmdldC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOw0KKwkJaWYgKHZpZXcgIT0gbnVsbCkgew0KKwkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkDQorCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgew0KKwkJCQlkZWNvcmF0b3JUYXJnZXQuaW5zdGFsbERlY29yYXRvcihTSE9SVENVVFNfREVDT1JBVE9SX0lELA0KKwkJCQkJCW5ldyBTaG9ydGN1dHNEZWNvcmF0b3IoZGVjb3JhdG9yVGFyZ2V0KSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgY2xhc3MgU2hvcnRjdXRzRGVjb3JhdG9yIGV4dGVuZHMgQWJzdHJhY3REZWNvcmF0b3Igew0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTaG9ydGN1dHNEZWNvcmF0b3IoSURlY29yYXRvclRhcmdldCBkZWNvcmF0b3JUYXJnZXQpIHsNCisJCQlzdXBlcihkZWNvcmF0b3JUYXJnZXQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgew0KKwkJCXJlZnJlc2goKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgew0KKwkJCXJlbW92ZURlY29yYXRpb24oKTsNCisJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZ2V0RGVjb3JhdG9yVGFyZ2V0KCkuZ2V0QWRhcHRlcigNCisJCQkJCUVkaXRQYXJ0LmNsYXNzKTsNCisJCQlJbWFnZSBpbWFnZSA9IENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQ0KKwkJCQkJLmdldEJ1bmRsZWRJbWFnZSgiaWNvbnMvc2hvcnRjdXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQNCisJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaGFwZUVkaXRQYXJ0KSB7DQorCQkJCXNldERlY29yYXRpb24oZ2V0RGVjb3JhdG9yVGFyZ2V0KCkuYWRkU2hhcGVEZWNvcmF0aW9uKGltYWdlLA0KKwkJCQkJCUlEZWNvcmF0b3JUYXJnZXQuRGlyZWN0aW9uLlNPVVRIX1dFU1QsIDAsIGZhbHNlKSk7DQorCQkJfSBlbHNlIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbm5lY3Rpb25FZGl0UGFydCkgew0KKwkJCQlzZXREZWNvcmF0aW9uKGdldERlY29yYXRvclRhcmdldCgpLmFkZENvbm5lY3Rpb25EZWNvcmF0aW9uKA0KKwkJCQkJCWltYWdlLCA1MCwgZmFsc2UpKTsNCisJCQl9DQorCQl9DQorDQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsVmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxWYWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJmOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsVmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NTMgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdERvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnJlc291cmNlcy5GaWxlQ2hhbmdlTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnJlc291cmNlcy5JRmlsZU9ic2VydmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZGVjb3JhdG9yLkFic3RyYWN0RGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmRlY29yYXRvci5DcmVhdGVEZWNvcmF0b3JzT3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmRlY29yYXRvci5JRGVjb3JhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmRlY29yYXRvci5JRGVjb3JhdG9yUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZGVjb3JhdG9yLklEZWNvcmF0b3JUYXJnZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLk1hcE1vZGVVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yOw0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbFZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXINCisJCWltcGxlbWVudHMgSURlY29yYXRvclByb3ZpZGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAidmFsaWRhdGlvblN0YXR1cyI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfVFlQRSA9IENvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQNCisJCQkrICIuZGlhZ25vc3RpYyI7IC8vJE5PTi1OTFMtMSQNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIE1hcmtlck9ic2VydmVyIGZpbGVPYnNlcnZlcjsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIE1hcC8qPFN0cmluZywgTGlzdDxJRGVjb3JhdG9yPj4qL2FsbERlY29yYXRvcnMgPSBuZXcgSGFzaE1hcCgpOw0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlRGVjb3JhdG9ycyhJRGVjb3JhdG9yVGFyZ2V0IGRlY29yYXRvclRhcmdldCkgew0KKwkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGRlY29yYXRvclRhcmdldA0KKwkJCQkuZ2V0QWRhcHRlcihFZGl0UGFydC5jbGFzcyk7DQorCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydA0KKwkJCQl8fCBlZGl0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0KSB7DQorCQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsNCisJCQlpZiAoKG1vZGVsIGluc3RhbmNlb2YgVmlldykpIHsNCisJCQkJVmlldyB2aWV3ID0gKFZpZXcpIG1vZGVsOw0KKwkJCQlpZiAoISh2aWV3IGluc3RhbmNlb2YgRWRnZSkgJiYgIXZpZXcuaXNTZXRFbGVtZW50KCkpIHsNCisJCQkJCXJldHVybjsNCisJCQkJfQ0KKwkJCX0NCisJCQlFZGl0RG9tYWluIGVkID0gZWRpdFBhcnQuZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpOw0KKwkJCWlmICghKGVkIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXREb21haW4pKSB7DQorCQkJCXJldHVybjsNCisJCQl9DQorCQkJaWYgKCgoRGlhZ3JhbUVkaXREb21haW4pIGVkKS5nZXRFZGl0b3JQYXJ0KCkgaW5zdGFuY2VvZiBDb21yZWxEaWFncmFtRWRpdG9yKSB7DQorCQkJCWRlY29yYXRvclRhcmdldC5pbnN0YWxsRGVjb3JhdG9yKEtFWSwgbmV3IFN0YXR1c0RlY29yYXRvcigNCisJCQkJCQlkZWNvcmF0b3JUYXJnZXQpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7DQorCQlpZiAoIShvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVEZWNvcmF0b3JzT3BlcmF0aW9uKSkgew0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJCUlEZWNvcmF0b3JUYXJnZXQgZGVjb3JhdG9yVGFyZ2V0ID0gKChDcmVhdGVEZWNvcmF0b3JzT3BlcmF0aW9uKSBvcGVyYXRpb24pDQorCQkJCS5nZXREZWNvcmF0b3JUYXJnZXQoKTsNCisJCVZpZXcgdmlldyA9IChWaWV3KSBkZWNvcmF0b3JUYXJnZXQuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsNCisJCXJldHVybiB2aWV3ICE9IG51bGwNCisJCQkJJiYgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRA0KKwkJCQkJCS5lcXVhbHMoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hEZWNvcmF0b3JzKFZpZXcgdmlldykgew0KKwkJcmVmcmVzaERlY29yYXRvcnMoVmlld1V0aWwuZ2V0SWRTdHIodmlldyksIHZpZXcuZ2V0RGlhZ3JhbSgpKTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZyZXNoRGVjb3JhdG9ycyhTdHJpbmcgdmlld0lkLCBEaWFncmFtIGRpYWdyYW0pIHsNCisJCWZpbmFsIExpc3QgZGVjb3JhdG9ycyA9IHZpZXdJZCAhPSBudWxsID8gKExpc3QpIGFsbERlY29yYXRvcnMNCisJCQkJLmdldCh2aWV3SWQpIDogbnVsbDsNCisJCWlmIChkZWNvcmF0b3JzID09IG51bGwgfHwgZGVjb3JhdG9ycy5pc0VtcHR5KCkgfHwgZGlhZ3JhbSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJZmluYWwgRGlhZ3JhbSBmZGlhZ3JhbSA9IGRpYWdyYW07DQorCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KKw0KKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJdHJ5IHsNCisJCQkJCVRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGZkaWFncmFtKS5ydW5FeGNsdXNpdmUoDQorCQkJCQkJCW5ldyBSdW5uYWJsZSgpIHsNCisNCisJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGVjb3JhdG9ycy5pdGVyYXRvcigpOyBpdA0KKwkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsNCisJCQkJCQkJCQkJSURlY29yYXRvciBkZWNvcmF0b3IgPSAoSURlY29yYXRvcikgaXQNCisJCQkJCQkJCQkJCQkubmV4dCgpOw0KKwkJCQkJCQkJCQlkZWNvcmF0b3IucmVmcmVzaCgpOw0KKwkJCQkJCQkJCX0NCisJCQkJCQkJCX0NCisJCQkJCQkJfSk7DQorCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkJCSJEZWNvcmF0b3IgcmVmcmVzaCBmYWlsdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJfQ0KKwkJCX0NCisJCX0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXR1c0RlY29yYXRvciBleHRlbmRzIEFic3RyYWN0RGVjb3JhdG9yIHsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFN0cmluZyB2aWV3SWQ7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIFN0YXR1c0RlY29yYXRvcihJRGVjb3JhdG9yVGFyZ2V0IGRlY29yYXRvclRhcmdldCkgew0KKwkJCXN1cGVyKGRlY29yYXRvclRhcmdldCk7DQorCQkJdHJ5IHsNCisJCQkJZmluYWwgVmlldyB2aWV3ID0gKFZpZXcpIGdldERlY29yYXRvclRhcmdldCgpLmdldEFkYXB0ZXIoDQorCQkJCQkJVmlldy5jbGFzcyk7DQorCQkJCVRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHZpZXcpLnJ1bkV4Y2x1c2l2ZSgNCisJCQkJCQluZXcgUnVubmFibGUoKSB7DQorDQorCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCVN0YXR1c0RlY29yYXRvci50aGlzLnZpZXdJZCA9IHZpZXcgIT0gbnVsbCA/IFZpZXdVdGlsDQorCQkJCQkJCQkJCS5nZXRJZFN0cih2aWV3KSA6IG51bGw7DQorCQkJCQkJCX0NCisJCQkJCQl9KTsNCisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkJIlZpZXdJRCBhY2Nlc3MgZmFpbHVyZSIsIGUpOyAvLyROT04tTkxTLTEkCQkJDQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7DQorCQkJcmVtb3ZlRGVjb3JhdGlvbigpOw0KKwkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXREZWNvcmF0b3JUYXJnZXQoKS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOw0KKwkJCWlmICh2aWV3ID09IG51bGwgfHwgdmlldy5lUmVzb3VyY2UoKSA9PSBudWxsKSB7DQorCQkJCXJldHVybjsNCisJCQl9DQorCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldERlY29yYXRvclRhcmdldCgpLmdldEFkYXB0ZXIoDQorCQkJCQlFZGl0UGFydC5jbGFzcyk7DQorCQkJaWYgKGVkaXRQYXJ0ID09IG51bGwgfHwgZWRpdFBhcnQuZ2V0Vmlld2VyKCkgPT0gbnVsbCkgew0KKwkJCQlyZXR1cm47DQorCQkJfQ0KKw0KKwkJCS8vIHF1ZXJ5IGZvciBhbGwgdGhlIHZhbGlkYXRpb24gbWFya2VycyBvZiB0aGUgY3VycmVudCByZXNvdXJjZQ0KKwkJCVN0cmluZyBlbGVtZW50SWQgPSBWaWV3VXRpbC5nZXRJZFN0cih2aWV3KTsNCisJCQlpZiAoZWxlbWVudElkID09IG51bGwpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCQlpbnQgc2V2ZXJpdHkgPSBJTWFya2VyLlNFVkVSSVRZX0lORk87DQorCQkJSU1hcmtlciBmb3VuZE1hcmtlciA9IG51bGw7DQorCQkJSVJlc291cmNlIHJlc291cmNlID0gV29ya3NwYWNlU3luY2hyb25pemVyDQorCQkJCQkuZ2V0RmlsZSh2aWV3LmVSZXNvdXJjZSgpKTsNCisJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhcmVzb3VyY2UuZXhpc3RzKCkpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCQlJTWFya2VyW10gbWFya2VycyA9IG51bGw7DQorCQkJdHJ5IHsNCisJCQkJbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKE1BUktFUl9UWVBFLCB0cnVlLA0KKwkJCQkJCUlSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7DQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCQkiVmFsaWRhdGlvbiBtYXJrZXJzIHJlZnJlc2ggZmFpbHVyZSIsIGUpOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJCWlmIChtYXJrZXJzID09IG51bGwgfHwgbWFya2Vycy5sZW5ndGggPT0gMCkgew0KKwkJCQlyZXR1cm47DQorCQkJfQ0KKwkJCUxhYmVsIHRvb2xUaXAgPSBudWxsOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgew0KKwkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07DQorCQkJCVN0cmluZyBhdHRyaWJ1dGUgPSBtYXJrZXINCisJCQkJCQkuZ2V0QXR0cmlidXRlKA0KKwkJCQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnJlc291cmNlcy5JTWFya2VyLkVMRU1FTlRfSUQsDQorCQkJCQkJCQkiIik7IC8vJE5PTi1OTFMtMSQNCisJCQkJaWYgKGF0dHJpYnV0ZS5lcXVhbHMoZWxlbWVudElkKSkgew0KKwkJCQkJaW50IG5leHRTZXZlcml0eSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwNCisJCQkJCQkJSU1hcmtlci5TRVZFUklUWV9JTkZPKTsNCisJCQkJCUltYWdlIG5leHRJbWFnZSA9IGdldEltYWdlKG5leHRTZXZlcml0eSk7DQorCQkJCQlpZiAoZm91bmRNYXJrZXIgPT0gbnVsbCkgew0KKwkJCQkJCWZvdW5kTWFya2VyID0gbWFya2VyOw0KKwkJCQkJCXRvb2xUaXAgPSBuZXcgTGFiZWwobWFya2VyLmdldEF0dHJpYnV0ZSgNCisJCQkJCQkJCUlNYXJrZXIuTUVTU0FHRSwgIiIpLCAvLyROT04tTkxTLTEkDQorCQkJCQkJCQluZXh0SW1hZ2UpOw0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQlpZiAodG9vbFRpcC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkgew0KKwkJCQkJCQlMYWJlbCBjb21vc2l0ZUxhYmVsID0gbmV3IExhYmVsKCk7DQorCQkJCQkJCUZsb3dMYXlvdXQgZmwgPSBuZXcgRmxvd0xheW91dChmYWxzZSk7DQorCQkJCQkJCWZsLnNldE1pbm9yU3BhY2luZygwKTsNCisJCQkJCQkJY29tb3NpdGVMYWJlbC5zZXRMYXlvdXRNYW5hZ2VyKGZsKTsNCisJCQkJCQkJY29tb3NpdGVMYWJlbC5hZGQodG9vbFRpcCk7DQorCQkJCQkJCXRvb2xUaXAgPSBjb21vc2l0ZUxhYmVsOw0KKwkJCQkJCX0NCisJCQkJCQl0b29sVGlwLmFkZChuZXcgTGFiZWwobWFya2VyLmdldEF0dHJpYnV0ZSgNCisJCQkJCQkJCUlNYXJrZXIuTUVTU0FHRSwgIiIpLCAvLyROT04tTkxTLTEkDQorCQkJCQkJCQluZXh0SW1hZ2UpKTsNCisJCQkJCX0NCisJCQkJCXNldmVyaXR5ID0gKG5leHRTZXZlcml0eSA+IHNldmVyaXR5KSA/IG5leHRTZXZlcml0eQ0KKwkJCQkJCQk6IHNldmVyaXR5Ow0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmIChmb3VuZE1hcmtlciA9PSBudWxsKSB7DQorCQkJCXJldHVybjsNCisJCQl9DQorDQorCQkJLy8gYWRkIGRlY29yYXRpb24NCisJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQpIHsNCisJCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBFZGdlKSB7DQorCQkJCQlzZXREZWNvcmF0aW9uKGdldERlY29yYXRvclRhcmdldCgpLmFkZENvbm5lY3Rpb25EZWNvcmF0aW9uKA0KKwkJCQkJCQlnZXRJbWFnZShzZXZlcml0eSksIDUwLCB0cnVlKSk7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlpbnQgbWFyZ2luID0gLTE7DQorCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQpIHsNCisJCQkJCQltYXJnaW4gPSBNYXBNb2RlVXRpbC5nZXRNYXBNb2RlKA0KKwkJCQkJCQkJKChvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0KQ0KKwkJCQkJCQkJCQkuZ2V0RmlndXJlKCkpLkRQdG9MUChtYXJnaW4pOw0KKwkJCQkJfQ0KKwkJCQkJc2V0RGVjb3JhdGlvbihnZXREZWNvcmF0b3JUYXJnZXQoKQ0KKwkJCQkJCQkuYWRkU2hhcGVEZWNvcmF0aW9uKGdldEltYWdlKHNldmVyaXR5KSwNCisJCQkJCQkJCQlJRGVjb3JhdG9yVGFyZ2V0LkRpcmVjdGlvbi5OT1JUSF9FQVNULA0KKwkJCQkJCQkJCW1hcmdpbiwgdHJ1ZSkpOw0KKwkJCQl9DQorCQkJCWdldERlY29yYXRpb24oKS5zZXRUb29sVGlwKHRvb2xUaXApOw0KKwkJCX0NCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIEltYWdlIGdldEltYWdlKGludCBzZXZlcml0eSkgew0KKwkJCVN0cmluZyBpbWFnZU5hbWUgPSBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSzsNCisJCQlzd2l0Y2ggKHNldmVyaXR5KSB7DQorCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOg0KKwkJCQlpbWFnZU5hbWUgPSBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSzsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc6DQorCQkJCWltYWdlTmFtZSA9IElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0s7DQorCQkJCWJyZWFrOw0KKwkJCWRlZmF1bHQ6DQorCQkJCWltYWdlTmFtZSA9IElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0s7DQorCQkJfQ0KKwkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpDQorCQkJCQkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsNCisJCQlpZiAodmlld0lkID09IG51bGwpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisNCisJCQkvLyBhZGQgc2VsZiB0byBnbG9iYWwgZGVjb3JhdG9ycyByZWdpc3RyeQ0KKwkJCUxpc3QgbGlzdCA9IChMaXN0KSBhbGxEZWNvcmF0b3JzLmdldCh2aWV3SWQpOw0KKwkJCWlmIChsaXN0ID09IG51bGwpIHsNCisJCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoMik7DQorCQkJCWxpc3QuYWRkKHRoaXMpOw0KKwkJCQlhbGxEZWNvcmF0b3JzLnB1dCh2aWV3SWQsIGxpc3QpOw0KKwkJCX0gZWxzZSBpZiAoIWxpc3QuY29udGFpbnModGhpcykpIHsNCisJCQkJbGlzdC5hZGQodGhpcyk7DQorCQkJfQ0KKw0KKwkJCS8vIHN0YXJ0IGxpc3RlbmluZyB0byBjaGFuZ2VzIGluIHJlc291cmNlcw0KKwkJCVZpZXcgdmlldyA9IChWaWV3KSBnZXREZWNvcmF0b3JUYXJnZXQoKS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOw0KKwkJCWlmICh2aWV3ID09IG51bGwpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCQlEaWFncmFtIGRpYWdyYW1WaWV3ID0gdmlldy5nZXREaWFncmFtKCk7DQorCQkJaWYgKGRpYWdyYW1WaWV3ID09IG51bGwpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCQlpZiAoZmlsZU9ic2VydmVyID09IG51bGwpIHsNCisJCQkJRmlsZUNoYW5nZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRGaWxlT2JzZXJ2ZXIoDQorCQkJCQkJZmlsZU9ic2VydmVyID0gbmV3IE1hcmtlck9ic2VydmVyKGRpYWdyYW1WaWV3KSk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7DQorCQkJaWYgKHZpZXdJZCA9PSBudWxsKSB7DQorCQkJCXJldHVybjsNCisJCQl9DQorDQorCQkJLy8gcmVtb3ZlIHNlbGYgZnJvbSBnbG9iYWwgZGVjb3JhdG9ycyByZWdpc3RyeQ0KKwkJCUxpc3QgbGlzdCA9IChMaXN0KSBhbGxEZWNvcmF0b3JzLmdldCh2aWV3SWQpOw0KKwkJCWlmIChsaXN0ICE9IG51bGwpIHsNCisJCQkJbGlzdC5yZW1vdmUodGhpcyk7DQorCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkgew0KKwkJCQkJYWxsRGVjb3JhdG9ycy5yZW1vdmUodmlld0lkKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQkvLyBzdG9wIGxpc3RlbmluZyB0byBjaGFuZ2VzIGluIHJlc291cmNlcyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBkZWNvcmF0b3JzDQorCQkJaWYgKGZpbGVPYnNlcnZlciAhPSBudWxsICYmIGFsbERlY29yYXRvcnMuaXNFbXB0eSgpKSB7DQorCQkJCUZpbGVDaGFuZ2VNYW5hZ2VyLmdldEluc3RhbmNlKCkNCisJCQkJCQkucmVtb3ZlRmlsZU9ic2VydmVyKGZpbGVPYnNlcnZlcik7DQorCQkJCWZpbGVPYnNlcnZlciA9IG51bGw7DQorCQkJfQ0KKwkJCXN1cGVyLmRlYWN0aXZhdGUoKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJc3RhdGljIGNsYXNzIE1hcmtlck9ic2VydmVyIGltcGxlbWVudHMgSUZpbGVPYnNlcnZlciB7DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJpdmF0ZSBNYXJrZXJPYnNlcnZlcihEaWFncmFtIGRpYWdyYW0pIHsNCisJCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGhhbmRsZUZpbGVSZW5hbWVkKElGaWxlIG9sZEZpbGUsIElGaWxlIGZpbGUpIHsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBoYW5kbGVGaWxlTW92ZWQoSUZpbGUgb2xkRmlsZSwgSUZpbGUgZmlsZSkgew0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGhhbmRsZUZpbGVEZWxldGVkKElGaWxlIGZpbGUpIHsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgdm9pZCBoYW5kbGVGaWxlQ2hhbmdlZChJRmlsZSBmaWxlKSB7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgaGFuZGxlTWFya2VyQWRkZWQoSU1hcmtlciBtYXJrZXIpIHsNCisJCQlpZiAobWFya2VyDQorCQkJCQkuZ2V0QXR0cmlidXRlKA0KKwkJCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkucmVzb3VyY2VzLklNYXJrZXIuRUxFTUVOVF9JRCwNCisJCQkJCQkJbnVsbCkgIT0gbnVsbCkgew0KKwkJCQloYW5kbGVNYXJrZXJDaGFuZ2VkKG1hcmtlcik7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGhhbmRsZU1hcmtlckRlbGV0ZWQoSU1hcmtlciBtYXJrZXIsIE1hcCBhdHRyaWJ1dGVzKSB7DQorCQkJU3RyaW5nIHZpZXdJZCA9IChTdHJpbmcpIGF0dHJpYnV0ZXMNCisJCQkJCS5nZXQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnJlc291cmNlcy5JTWFya2VyLkVMRU1FTlRfSUQpOw0KKwkJCXJlZnJlc2hEZWNvcmF0b3JzKHZpZXdJZCwgZGlhZ3JhbSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIHZvaWQgaGFuZGxlTWFya2VyQ2hhbmdlZChJTWFya2VyIG1hcmtlcikgew0KKwkJCWlmICghTUFSS0VSX1RZUEUuZXF1YWxzKGdldFR5cGUobWFya2VyKSkpIHsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCQlTdHJpbmcgdmlld0lkID0gbWFya2VyDQorCQkJCQkuZ2V0QXR0cmlidXRlKA0KKwkJCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkucmVzb3VyY2VzLklNYXJrZXIuRUxFTUVOVF9JRCwNCisJCQkJCQkJIiIpOyAvLyROT04tTkxTLTEkDQorCQkJcmVmcmVzaERlY29yYXRvcnModmlld0lkLCBkaWFncmFtKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKElNYXJrZXIgbWFya2VyKSB7DQorCQkJdHJ5IHsNCisJCQkJcmV0dXJuIG1hcmtlci5nZXRUeXBlKCk7DQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQorCQkJCUNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigNCisJCQkJCQkiVmFsaWRhdGlvbiBtYXJrZXIgcmVmcmVzaCBmYWlsdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQNCisJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbFZhbGlkYXRpb25Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvQ29tcmVsVmFsaWRhdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3MDQyMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbFZhbGlkYXRpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0uZWRpdC5wYXJ0cy5Db21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wYXJ0LkNvbXJlbERpYWdyYW1FZGl0b3JQbHVnaW47DQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLnBhcnQuQ29tcmVsVmlzdWFsSURSZWdpc3RyeTsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbFZhbGlkYXRpb25Qcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnN0cmFpbnRzQWN0aXZlID0gZmFsc2U7DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkQ29uc3RyYWludHNCZVByaXZhdGUoKSB7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5XaXRoQ29uc3RyYWludHMoDQorCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgUnVubmFibGUgb3BlcmF0aW9uKSB7DQorCQlmaW5hbCBSdW5uYWJsZSBvcCA9IG9wZXJhdGlvbjsNCisJCVJ1bm5hYmxlIHRhc2sgPSBuZXcgUnVubmFibGUoKSB7DQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQl0cnkgew0KKwkJCQkJY29uc3RyYWludHNBY3RpdmUgPSB0cnVlOw0KKwkJCQkJb3AucnVuKCk7DQorCQkJCX0gZmluYWxseSB7DQorCQkJCQljb25zdHJhaW50c0FjdGl2ZSA9IGZhbHNlOw0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisJCWlmIChlZGl0aW5nRG9tYWluICE9IG51bGwpIHsNCisJCQl0cnkgew0KKwkJCQllZGl0aW5nRG9tYWluLnJ1bkV4Y2x1c2l2ZSh0YXNrKTsNCisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQorCQkJCQkJIlZhbGlkYXRpb24gZmFpbGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCXRhc2sucnVuKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXN0YXRpYyBib29sZWFuIGlzSW5EZWZhdWx0RWRpdG9yQ29udGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoc2hvdWxkQ29uc3RyYWludHNCZVByaXZhdGUoKSAmJiAhY29uc3RyYWludHNBY3RpdmUpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmlldykgew0KKwkJCXJldHVybiBjb25zdHJhaW50c0FjdGl2ZQ0KKwkJCQkJJiYgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRA0KKwkJCQkJCQkuZXF1YWxzKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0TW9kZWxJRCgoVmlldykgb2JqZWN0KSk7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxWaWV3UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vcHJvdmlkZXJzL0NvbXJlbFZpZXdQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODZhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9Db21yZWxWaWV3UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU0MzEgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJvdmlkZXJzLklWaWV3UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy52aWV3LkNyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMudmlldy5DcmVhdGVFZGdlVmlld09wZXJhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlTm9kZVZpZXdPcGVyYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy52aWV3LkNyZWF0ZVZpZXdGb3JLaW5kT3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMudmlldy5DcmVhdGVWaWV3T3BlcmF0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVNRkNvcmVVdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQ29ubmVjdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EZWNvcmF0aW9uTm9kZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTWVhc3VyZW1lbnRVbml0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uUmVsYXRpdmVCZW5kcG9pbnRzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Sb3V0aW5nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVGl0bGVTdHlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uZGF0YXR5cGUuUmVsYXRpdmVCZW5kcG9pbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLmVkaXQucGFydHMuKjsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsVmlld1Byb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzDQorCQlJVmlld1Byb3ZpZGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBmaW5hbCBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7DQorCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQ3JlYXRlVmlld0ZvcktpbmRPcGVyYXRpb24pIHsNCisJCQlyZXR1cm4gcHJvdmlkZXMoKENyZWF0ZVZpZXdGb3JLaW5kT3BlcmF0aW9uKSBvcGVyYXRpb24pOw0KKwkJfQ0KKwkJYXNzZXJ0IG9wZXJhdGlvbiBpbnN0YW5jZW9mIENyZWF0ZVZpZXdPcGVyYXRpb247DQorCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb24pIHsNCisJCQlyZXR1cm4gcHJvdmlkZXMoKENyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uKSBvcGVyYXRpb24pOw0KKwkJfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVFZGdlVmlld09wZXJhdGlvbikgew0KKwkJCXJldHVybiBwcm92aWRlcygoQ3JlYXRlRWRnZVZpZXdPcGVyYXRpb24pIG9wZXJhdGlvbik7DQorCQl9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIENyZWF0ZU5vZGVWaWV3T3BlcmF0aW9uKSB7DQorCQkJcmV0dXJuIHByb3ZpZGVzKChDcmVhdGVOb2RlVmlld09wZXJhdGlvbikgb3BlcmF0aW9uKTsNCisJCX0NCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvdmlkZXMoQ3JlYXRlVmlld0ZvcktpbmRPcGVyYXRpb24gb3ApIHsNCisJCS8qDQorCQkgaWYgKG9wLmdldFZpZXdLaW5kKCkgPT0gTm9kZS5jbGFzcykNCisJCSByZXR1cm4gZ2V0Tm9kZVZpZXdDbGFzcyhvcC5nZXRTZW1hbnRpY0FkYXB0ZXIoKSwgb3AuZ2V0Q29udGFpbmVyVmlldygpLCBvcC5nZXRTZW1hbnRpY0hpbnQoKSkgIT0gbnVsbDsNCisJCSBpZiAob3AuZ2V0Vmlld0tpbmQoKSA9PSBFZGdlLmNsYXNzKQ0KKwkJIHJldHVybiBnZXRFZGdlVmlld0NsYXNzKG9wLmdldFNlbWFudGljQWRhcHRlcigpLCBvcC5nZXRDb250YWluZXJWaWV3KCksIG9wLmdldFNlbWFudGljSGludCgpKSAhPSBudWxsOw0KKwkJICovDQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvdmlkZXMoQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb24gb3ApIHsNCisJCXJldHVybiBDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhvcA0KKwkJCQkuZ2V0U2VtYW50aWNIaW50KCkpDQorCQkJCSYmIENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0RGlhZ3JhbVZpc3VhbElEKGdldFNlbWFudGljRWxlbWVudChvcA0KKwkJCQkJCQkJLmdldFNlbWFudGljQWRhcHRlcigpKSkgIT0gLTE7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHByb3ZpZGVzKENyZWF0ZU5vZGVWaWV3T3BlcmF0aW9uIG9wKSB7DQorCQlpZiAob3AuZ2V0Q29udGFpbmVyVmlldygpID09IG51bGwpIHsNCisJCQlyZXR1cm4gZmFsc2U7DQorCQl9DQorCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKG9wDQorCQkJCS5nZXRTZW1hbnRpY0FkYXB0ZXIoKSk7DQorCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQob3AuZ2V0U2VtYW50aWNBZGFwdGVyKCkpOw0KKwkJaW50IHZpc3VhbElEOw0KKwkJaWYgKG9wLmdldFNlbWFudGljSGludCgpID09IG51bGwpIHsNCisJCQkvLyBTZW1hbnRpYyBoaW50IGlzIG5vdCBzcGVjaWZpZWQuIENhbiBiZSBhIHJlc3VsdCBvZiBjYWxsIGZyb20gQ2Fub25pY2FsRWRpdFBvbGljeS4NCisJCQkvLyBJbiB0aGlzIHNpdHVhdGlvbiB0aGVyZSBzaG91bGQgYmUgTk8gZWxlbWVudFR5cGUsIHZpc3VhbElEIHdpbGwgYmUgZGV0ZXJtaW5lZA0KKwkJCS8vIGJ5IFZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKCkgZm9yIGRvbWFpbkVsZW1lbnQuDQorCQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwgfHwgZG9tYWluRWxlbWVudCA9PSBudWxsKSB7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQkJdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCgNCisJCQkJCW9wLmdldENvbnRhaW5lclZpZXcoKSwgZG9tYWluRWxlbWVudCk7DQorCQl9IGVsc2Ugew0KKwkJCXZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChvcC5nZXRTZW1hbnRpY0hpbnQoKSk7DQorCQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwpIHsNCisJCQkJaWYgKCFDb21yZWxFbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKQ0KKwkJCQkJCXx8ICghKGVsZW1lbnRUeXBlIGluc3RhbmNlb2YgSUhpbnRlZFR5cGUpKSkgew0KKwkJCQkJcmV0dXJuIGZhbHNlOyAvLyBmb3JlaWduIGVsZW1lbnQgdHlwZQ0KKwkJCQl9DQorCQkJCVN0cmluZyBlbGVtZW50VHlwZUhpbnQgPSAoKElIaW50ZWRUeXBlKSBlbGVtZW50VHlwZSkNCisJCQkJCQkuZ2V0U2VtYW50aWNIaW50KCk7DQorCQkJCWlmICghb3AuZ2V0U2VtYW50aWNIaW50KCkuZXF1YWxzKGVsZW1lbnRUeXBlSGludCkpIHsNCisJCQkJCXJldHVybiBmYWxzZTsgLy8gaWYgc2VtYW50aWMgaGludCBpcyBzcGVjaWZpZWQgaXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluIGVsZW1lbnQgdHlwZQ0KKwkJCQl9DQorCQkJCWlmIChkb21haW5FbGVtZW50ICE9IG51bGwNCisJCQkJCQkmJiB2aXN1YWxJRCAhPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCgNCisJCQkJCQkJCW9wLmdldENvbnRhaW5lclZpZXcoKSwgZG9tYWluRWxlbWVudCkpIHsNCisJCQkJCXJldHVybiBmYWxzZTsgLy8gdmlzdWFsIGlkIGZvciBub2RlIEVDbGFzcyBzaG91bGQgbWF0Y2ggdmlzdWFsIGlkIGZyb20gZWxlbWVudCB0eXBlDQorCQkJCX0NCisJCQl9IGVsc2Ugew0KKwkJCQlpZiAoIUNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdFBhcnQuTU9ERUxfSUQNCisJCQkJCQkuZXF1YWxzKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChvcA0KKwkJCQkJCQkJLmdldENvbnRhaW5lclZpZXcoKSkpKSB7DQorCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGZvcmVpZ24gZGlhZ3JhbQ0KKwkJCQl9DQorCQkJCXN3aXRjaCAodmlzdWFsSUQpIHsNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2VxdWVudGlhbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIE11bHRpRmlsdGVyVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBNdWx0aUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIFNlcXVlbnRpYWxVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQkJY2FzZSBDb25kaXRpb25hbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIEF0b21pY1VuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCQljYXNlIENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQXRvbWljVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCWNhc2UgQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsDQorCQkJCQkJCXx8IHZpc3VhbElEICE9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKG9wLmdldENvbnRhaW5lclZpZXcoKSwNCisJCQkJCQkJCQkJCWRvbWFpbkVsZW1lbnQpKSB7DQorCQkJCQkJcmV0dXJuIGZhbHNlOyAvLyB2aXN1YWwgaWQgaW4gc2VtYW50aWMgaGludCBzaG91bGQgbWF0Y2ggdmlzdWFsIGlkIGZvciBkb21haW4gZWxlbWVudA0KKwkJCQkJfQ0KKwkJCQkJYnJlYWs7DQorCQkJCWRlZmF1bHQ6DQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlyZXR1cm4gU2luZ2xlSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgU2VxdWVudGlhbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUlucHV0UG9ydEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IENhcnRlc2lhblF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IE11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUlucHV0UG9ydDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IE11bHRpSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZVF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IENhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNlcXVlbnRpYWxVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IE11bHRpSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IENhcnRlc2lhblF1ZXVlZFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IEF0b21pY1VuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgU2VxdWVudGlhbFVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZVF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZVF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNlcXVlbnRpYWxVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IEF0b21pY1VuaXQ0RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQgPT0gdmlzdWFsSUQNCisJCQkJfHwgQ29uZGl0aW9uYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IFNlcXVlbnRpYWxVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSB2aXN1YWxJRA0KKwkJCQl8fCBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IENvbmRpdGlvbkNoZWNrRWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEDQorCQkJCXx8IEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEID09IHZpc3VhbElEOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlcyhDcmVhdGVFZGdlVmlld09wZXJhdGlvbiBvcCkgew0KKwkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShvcA0KKwkJCQkuZ2V0U2VtYW50aWNBZGFwdGVyKCkpOw0KKwkJaWYgKCFDb21yZWxFbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKQ0KKwkJCQl8fCAoIShlbGVtZW50VHlwZSBpbnN0YW5jZW9mIElIaW50ZWRUeXBlKSkpIHsNCisJCQlyZXR1cm4gZmFsc2U7IC8vIGZvcmVpZ24gZWxlbWVudCB0eXBlDQorCQl9DQorCQlTdHJpbmcgZWxlbWVudFR5cGVIaW50ID0gKChJSGludGVkVHlwZSkgZWxlbWVudFR5cGUpLmdldFNlbWFudGljSGludCgpOw0KKwkJaWYgKGVsZW1lbnRUeXBlSGludCA9PSBudWxsDQorCQkJCXx8IChvcC5nZXRTZW1hbnRpY0hpbnQoKSAhPSBudWxsICYmICFlbGVtZW50VHlwZUhpbnQuZXF1YWxzKG9wDQorCQkJCQkJLmdldFNlbWFudGljSGludCgpKSkpIHsNCisJCQlyZXR1cm4gZmFsc2U7IC8vIG91ciBoaW50IGlzIHZpc3VhbCBpZCBhbmQgbXVzdCBiZSBzcGVjaWZpZWQsIGFuZCBpdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gZWxlbWVudCB0eXBlDQorCQl9DQorCQlpbnQgdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGVsZW1lbnRUeXBlSGludCk7DQorCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQob3AuZ2V0U2VtYW50aWNBZGFwdGVyKCkpOw0KKwkJaWYgKGRvbWFpbkVsZW1lbnQgIT0gbnVsbA0KKwkJCQkmJiB2aXN1YWxJRCAhPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChkb21haW5FbGVtZW50KSkgew0KKwkJCXJldHVybiBmYWxzZTsgLy8gdmlzdWFsIGlkIGZvciBsaW5rIEVDbGFzcyBzaG91bGQgbWF0Y2ggdmlzdWFsIGlkIGZyb20gZWxlbWVudCB0eXBlDQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbShJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwNCisJCQlTdHJpbmcgZGlhZ3JhbUtpbmQsIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCURpYWdyYW0gZGlhZ3JhbSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpOw0KKwkJZGlhZ3JhbS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtU3R5bGUoKSk7DQorCQlkaWFncmFtLnNldFR5cGUoQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRCk7DQorCQlkaWFncmFtLnNldEVsZW1lbnQoZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcikpOw0KKwkJZGlhZ3JhbS5zZXRNZWFzdXJlbWVudFVuaXQoTWVhc3VyZW1lbnRVbml0LlBJWEVMX0xJVEVSQUwpOw0KKwkJcmV0dXJuIGRpYWdyYW07DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU5vZGUoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywNCisJCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCWZpbmFsIEVPYmplY3QgZG9tYWluRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOw0KKwkJZmluYWwgaW50IHZpc3VhbElEOw0KKwkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7DQorCQkJdmlzdWFsSUQgPSBDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LA0KKwkJCQkJZG9tYWluRWxlbWVudCk7DQorCQl9IGVsc2Ugew0KKwkJCXZpc3VhbElEID0gQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChzZW1hbnRpY0hpbnQpOw0KKwkJfQ0KKwkJc3dpdGNoICh2aXN1YWxJRCkgew0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZUlucHV0UG9ydF8yMDAxKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDIoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0XzIwMDMoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMjAwNChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbnRpYWxVbml0XzIwMDUoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlQ29uZGl0aW9uYWxVbml0XzIwMDYoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIEF0b21pY1VuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUF0b21pY1VuaXRfMjAwNyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LCBpbmRleCwNCisJCQkJCXBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMDEoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUlucHV0UG9ydF8zMDAyKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF8zMDAzKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfMzAwNChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMDUoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlJbnB1dFBvcnRfMzAwNihkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwNyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0XzMwMDgoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZUlucHV0UG9ydF8zMDA5KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aUlucHV0UG9ydDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZU11bHRpSW5wdXRQb3J0XzMwMTAoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIFNpbmdsZU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZU91dHB1dFBvcnRfMzAxMShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgTXVsdGlGZWF0dXJlVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlGZWF0dXJlVW5pdF8zMDEyKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVJbnB1dFBvcnRfMzAxMyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUlucHV0UG9ydF8zMDE0KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZU11bHRpT3V0cHV0UG9ydF8zMDE1KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0XzMwMTYoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlJbnB1dFBvcnRfMzAxNyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZU91dHB1dFBvcnRfMzAxOChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUZpbHRlclVuaXRfMzAxOShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUlucHV0UG9ydF8zMDIwKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aU91dHB1dFBvcnRfMzAyMShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzAyMihkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMjMoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlJbnB1dFBvcnRfMzAyNChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTZXF1ZW50aWFsVW5pdF8zMDI2KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVJbnB1dFBvcnRfMzAyNyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgTXVsdGlJbnB1dFBvcnQ4RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUlucHV0UG9ydF8zMDI4KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF8zMDI5KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVDb25kaXRpb25hbFVuaXRfMzAzMChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMzEoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIE11bHRpSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlJbnB1dFBvcnRfMzAzMihkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgQ2FydGVzaWFuUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfMzAzMyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUF0b21pY1VuaXRfMzAzNChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LCBpbmRleCwNCisJCQkJCXBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlSW5wdXRQb3J0OUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMzUoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIFBhcmFsbGVsUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF8zMDM2KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdF8zMDM4KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlGZWF0dXJlVW5pdF8zMDM5KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlRmlsdGVyVW5pdF8zMDQwKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQyRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUZpbHRlclVuaXRfMzA0MShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzA0Mihkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIFNlcXVlbnRpYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2VxdWVudGlhbFVuaXRfMzA0NChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgUGFyYWxsZWxRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUNvbmRpdGlvbmFsVW5pdF8zMDQ2KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDYXJ0ZXNpYW5RdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF8zMDQ3KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfMzA0OChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgQXRvbWljVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUF0b21pY1VuaXRfMzA0OShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LCBpbmRleCwNCisJCQkJCXBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdF8zMDUwKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlGZWF0dXJlVW5pdF8zMDUxKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlRmlsdGVyVW5pdF8zMDUyKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUZpbHRlclVuaXRfMzA1Myhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzA1NChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdF8zMDU1KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlGZWF0dXJlVW5pdF8zMDU2KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlRmlsdGVyVW5pdF8zMDU3KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUZpbHRlclVuaXRfMzA1OChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzA1OShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTZXF1ZW50aWFsVW5pdF8zMDYwKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0XzMwNjEoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIE11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUZlYXR1cmVVbml0XzMwNjIoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIFNpbmdsZUZpbHRlclVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0XzMwNjMoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIE11bHRpRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZU11bHRpRmlsdGVyVW5pdF8zMDY0KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlUXVldWVkVW5pdF8zMDY1KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVDb25kaXRpb25hbFVuaXRfMzA2Nihkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2luZ2xlUXVldWVkVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzA2Nyhkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUF0b21pY1VuaXRfMzA2OChkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LCBpbmRleCwNCisJCQkJCXBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTZXF1ZW50aWFsVW5pdF8zMDY5KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbnRpYWxVbml0XzMwNzAoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUNvbmRpdGlvbmFsVW5pdF8zMDcxKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVDb25kaXRpb25hbFVuaXRfMzA3Mihkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVTZXF1ZW50aWFsVW5pdF8zMDczKGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsDQorCQkJCQlpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlQXRvbWljVW5pdF8zMDc0KGRvbWFpbkVsZW1lbnQsIGNvbnRhaW5lclZpZXcsIGluZGV4LA0KKwkJCQkJcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBDb25kaXRpb25hbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVDb25kaXRpb25hbFVuaXRfMzA3NShkb21haW5FbGVtZW50LCBjb250YWluZXJWaWV3LA0KKwkJCQkJaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgQ29uZGl0aW9uQ2hlY2tFZGl0UGFydC5WSVNVQUxfSUQ6DQorCQkJcmV0dXJuIGNyZWF0ZUNvbmRpdGlvbkNoZWNrXzMwNzYoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywNCisJCQkJCWluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVBdG9taWNVbml0XzMwNzcoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywgaW5kZXgsDQorCQkJCQlwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQljYXNlIEF0b21pY1VuaXQ3RWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVBdG9taWNVbml0XzMwNzgoZG9tYWluRWxlbWVudCwgY29udGFpbmVyVmlldywgaW5kZXgsDQorCQkJCQlwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQl9DQorCQkvLyBjYW4ndCBoYXBwZW4sIHByb3ZpZGVkICNwcm92aWRlcyhDcmVhdGVOb2RlVmlld09wZXJhdGlvbikgaXMgY29ycmVjdA0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGdlIGNyZWF0ZUVkZ2UoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywNCisJCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsNCisJCVN0cmluZyBlbGVtZW50VHlwZUhpbnQgPSAoKElIaW50ZWRUeXBlKSBlbGVtZW50VHlwZSkuZ2V0U2VtYW50aWNIaW50KCk7DQorCQlzd2l0Y2ggKENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQoZWxlbWVudFR5cGVIaW50KSkgew0KKwkJY2FzZSBTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlU2luZ2xlUG9ydE1hcHBpbmdfNDAwMSgNCisJCQkJCWdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpLCBjb250YWluZXJWaWV3LCBpbmRleCwNCisJCQkJCXBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsNCisJCWNhc2UgTXVsdGlQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRDoNCisJCQlyZXR1cm4gY3JlYXRlTXVsdGlQb3J0TWFwcGluZ180MDAyKA0KKwkJCQkJZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlciksIGNvbnRhaW5lclZpZXcsIGluZGV4LA0KKwkJCQkJcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOw0KKwkJY2FzZSBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEOg0KKwkJCXJldHVybiBjcmVhdGVNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMoDQorCQkJCQlnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKSwgY29udGFpbmVyVmlldywgaW5kZXgsDQorCQkJCQlwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7DQorCQl9DQorCQkvLyBjYW4gbmV2ZXIgaGFwcGVuLCBwcm92aWRlZCAjcHJvdmlkZXMoQ3JlYXRlRWRnZVZpZXdPcGVyYXRpb24pIGlzIGNvcnJlY3QNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVJbnB1dFBvcnRfMjAwMShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCXN0YW1wU2hvcnRjdXQoY29udGFpbmVyVmlldywgbm9kZSk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMDEgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAwMS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDAxID0gKExvY2F0aW9uKSBsYWJlbDUwMDEuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDAxLnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMDEuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0XzIwMDIoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCXN0YW1wU2hvcnRjdXQoY29udGFpbmVyVmlldywgbm9kZSk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwODAgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF8yMDAzKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCXN0YW1wU2hvcnRjdXQoY29udGFpbmVyVmlldywgbm9kZSk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwODEgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVRdWV1ZWRVbml0XzIwMDQoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCXN0YW1wU2hvcnRjdXQoY29udGFpbmVyVmlldywgbm9kZSk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwODIgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2VxdWVudGlhbFVuaXRfMjAwNShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCXN0YW1wU2hvcnRjdXQoY29udGFpbmVyVmlldywgbm9kZSk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwODMgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ29uZGl0aW9uYWxVbml0XzIwMDYoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJc3RhbXBTaG9ydGN1dChjb250YWluZXJWaWV3LCBub2RlKTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA4NCA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDdFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVBdG9taWNVbml0XzIwMDcoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQXRvbWljVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJc3RhbXBTaG9ydGN1dChjb250YWluZXJWaWV3LCBub2RlKTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA4NSA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMDEoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDAyID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDAyLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMDIgPSAoTG9jYXRpb24pIGxhYmVsNTAwMi5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMDIuc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAwMi5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU11bHRpSW5wdXRQb3J0XzMwMDIoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlOb2RlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vZGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkNCisJCQkJLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMDMgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDAzLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMDMgPSAoTG9jYXRpb24pIGxhYmVsNTAwMy5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMDMuc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAwMy5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfMzAwMyhFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA3OSA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0XzMwMDQoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA3OCA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMDUoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDA0ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDA0LnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMDQgPSAoTG9jYXRpb24pIGxhYmVsNTAwNC5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMDQuc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAwNC5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU11bHRpSW5wdXRQb3J0XzMwMDYoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlOb2RlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vZGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkNCisJCQkJLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDA1ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlsYWJlbDUwMDUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVMb2NhdGlvbigpKTsNCisJCUxvY2F0aW9uIGxvY2F0aW9uNTAwNSA9IChMb2NhdGlvbikgbGFiZWw1MDA1LmdldExheW91dENvbnN0cmFpbnQoKTsNCisJCWxvY2F0aW9uNTAwNS5zZXRYKDApOw0KKwkJbG9jYXRpb241MDA1LnNldFkoNSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF8zMDA3KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDc3ID0gY3JlYXRlTGFiZWwoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdF8zMDA4KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMDkgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZUlucHV0UG9ydF8zMDA5KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAwNiA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAwNi5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDA2ID0gKExvY2F0aW9uKSBsYWJlbDUwMDYuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDA2LnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMDYuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVNdWx0aUlucHV0UG9ydF8zMDEwKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJTm9kZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb2RlKCk7DQorCQlub2RlLmdldFN0eWxlcygpDQorCQkJCS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAwNyA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDA3LnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMDcgPSAoTG9jYXRpb24pIGxhYmVsNTAwNy5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMDcuc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAwNy5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZU91dHB1dFBvcnRfMzAxMShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVPdXRwdXRQb3J0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMDggPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlsYWJlbDUwMDguc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVMb2NhdGlvbigpKTsNCisJCUxvY2F0aW9uIGxvY2F0aW9uNTAwOCA9IChMb2NhdGlvbikgbGFiZWw1MDA4LmdldExheW91dENvbnN0cmFpbnQoKTsNCisJCWxvY2F0aW9uNTAwOC5zZXRYKDApOw0KKwkJbG9jYXRpb241MDA4LnNldFkoNSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlGZWF0dXJlVW5pdF8zMDEyKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAxMyA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVJbnB1dFBvcnRfMzAxMyhFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMTAgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlsYWJlbDUwMTAuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVMb2NhdGlvbigpKTsNCisJCUxvY2F0aW9uIGxvY2F0aW9uNTAxMCA9IChMb2NhdGlvbikgbGFiZWw1MDEwLmdldExheW91dENvbnN0cmFpbnQoKTsNCisJCWxvY2F0aW9uNTAxMC5zZXRYKDApOw0KKwkJbG9jYXRpb241MDEwLnNldFkoNSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlJbnB1dFBvcnRfMzAxNChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCU5vZGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm9kZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKQ0KKwkJCQkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMTEgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAxMS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDExID0gKExvY2F0aW9uKSBsYWJlbDUwMTEuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDExLnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMTEuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVNdWx0aU91dHB1dFBvcnRfMzAxNShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCU5vZGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm9kZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKQ0KKwkJCQkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aU91dHB1dFBvcnRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMTIgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAxMi5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDEyID0gKExvY2F0aW9uKSBsYWJlbDUwMTIuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDEyLnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMTIuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0XzMwMTYoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDE2ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU11bHRpSW5wdXRQb3J0XzMwMTcoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlOb2RlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vZGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkNCisJCQkJLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDE0ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlsYWJlbDUwMTQuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVMb2NhdGlvbigpKTsNCisJCUxvY2F0aW9uIGxvY2F0aW9uNTAxNCA9IChMb2NhdGlvbikgbGFiZWw1MDE0LmdldExheW91dENvbnN0cmFpbnQoKTsNCisJCWxvY2F0aW9uNTAxNC5zZXRYKDApOw0KKwkJbG9jYXRpb241MDE0LnNldFkoNSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlT3V0cHV0UG9ydF8zMDE4KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMTUgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDE1LnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMTUgPSAoTG9jYXRpb24pIGxhYmVsNTAxNS5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMTUuc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAxNS5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU11bHRpRmlsdGVyVW5pdF8zMDE5KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDE5ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlJbnB1dFBvcnRfMzAyMChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCU5vZGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm9kZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKQ0KKwkJCQkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMTcgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAxNy5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDE3ID0gKExvY2F0aW9uKSBsYWJlbDUwMTcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDE3LnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMTcuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVNdWx0aU91dHB1dFBvcnRfMzAyMShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCU5vZGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm9kZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKQ0KKwkJCQkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDE4ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDE4LnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMTggPSAoTG9jYXRpb24pIGxhYmVsNTAxOC5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMTguc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAxOC5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzAyMihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA3NiA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZUlucHV0UG9ydF8zMDIzKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAyMCA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAyMC5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDIwID0gKExvY2F0aW9uKSBsYWJlbDUwMjAuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDIwLnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMjAuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVNdWx0aUlucHV0UG9ydF8zMDI0KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJTm9kZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOb2RlKCk7DQorCQlub2RlLmdldFN0eWxlcygpDQorCQkJCS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAyMSA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDIxLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMjEgPSAoTG9jYXRpb24pIGxhYmVsNTAyMS5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMjEuc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAyMS5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfMzAyNShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA3NSA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2VxdWVudGlhbFVuaXRfMzAyNihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNzQgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVJbnB1dFBvcnRfMzAyNyhFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMjIgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlsYWJlbDUwMjIuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVMb2NhdGlvbigpKTsNCisJCUxvY2F0aW9uIGxvY2F0aW9uNTAyMiA9IChMb2NhdGlvbikgbGFiZWw1MDIyLmdldExheW91dENvbnN0cmFpbnQoKTsNCisJCWxvY2F0aW9uNTAyMi5zZXRYKDApOw0KKwkJbG9jYXRpb241MDIyLnNldFkoNSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlJbnB1dFBvcnRfMzAyOChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCU5vZGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTm9kZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKQ0KKwkJCQkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUlucHV0UG9ydDhFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMjMgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnROYW1lVHlwZThFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAyMy5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDIzID0gKExvY2F0aW9uKSBsYWJlbDUwMjMuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDIzLnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMjMuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwMjkoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNzMgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZUNvbmRpdGlvbmFsVW5pdF8zMDMwKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXQyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNzIgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlSW5wdXRQb3J0XzMwMzEoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlSW5wdXRQb3J0OEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDI0ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJbGFiZWw1MDI0LnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlTG9jYXRpb24oKSk7DQorCQlMb2NhdGlvbiBsb2NhdGlvbjUwMjQgPSAoTG9jYXRpb24pIGxhYmVsNTAyNC5nZXRMYXlvdXRDb25zdHJhaW50KCk7DQorCQlsb2NhdGlvbjUwMjQuc2V0WCgwKTsNCisJCWxvY2F0aW9uNTAyNC5zZXRZKDUpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU11bHRpSW5wdXRQb3J0XzMwMzIoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlOb2RlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5vZGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkNCisJCQkJLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlJbnB1dFBvcnQ5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDI1ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlsYWJlbDUwMjUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVMb2NhdGlvbigpKTsNCisJCUxvY2F0aW9uIGxvY2F0aW9uNTAyNSA9IChMb2NhdGlvbikgbGFiZWw1MDI1LmdldExheW91dENvbnN0cmFpbnQoKTsNCisJCWxvY2F0aW9uNTAyNS5zZXRYKDApOw0KKwkJbG9jYXRpb241MDI1LnNldFkoNSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF8zMDMzKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDI4ID0gY3JlYXRlTGFiZWwoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVBdG9taWNVbml0XzMwMzQoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQXRvbWljVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAyNyA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZUlucHV0UG9ydF8zMDM1KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUlucHV0UG9ydDlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAyNiA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWxhYmVsNTAyNi5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJLmNyZWF0ZUxvY2F0aW9uKCkpOw0KKwkJTG9jYXRpb24gbG9jYXRpb241MDI2ID0gKExvY2F0aW9uKSBsYWJlbDUwMjYuZ2V0TGF5b3V0Q29uc3RyYWludCgpOw0KKwkJbG9jYXRpb241MDI2LnNldFgoMCk7DQorCQlsb2NhdGlvbjUwMjYuc2V0WSg1KTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfMzAzNihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDcxID0gY3JlYXRlTGFiZWwoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF8zMDM3KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNzAgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXRfMzAzOChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAyOSA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU11bHRpRmVhdHVyZVVuaXRfMzAzOShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDMwID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0XzMwNDAoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTAzMSA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlGaWx0ZXJVbml0XzMwNDEoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0MkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDMyID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlMkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzA0MihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA2OSA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDMoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA2OCA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTZXF1ZW50aWFsVW5pdF8zMDQ0KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA2NyA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0XzMwNDUoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA2NiA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVDb25kaXRpb25hbFVuaXRfMzA0NihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDY1ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0XzMwNDcoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMzMgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0VkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF8zMDQ4KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMzUgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQXRvbWljVW5pdF8zMDQ5KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMzQgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdExhYmVsVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdF8zMDUwKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDM2ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlGZWF0dXJlVW5pdF8zMDUxKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMzcgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZUZpbHRlclVuaXRfMzA1MihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDM4ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVNdWx0aUZpbHRlclVuaXRfMzA1MyhFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXQzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwMzkgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUzRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlUXVldWVkVW5pdF8zMDU0KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDY0ID0gY3JlYXRlTGFiZWwoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdF8zMDU1KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDQwID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlGZWF0dXJlVW5pdF8zMDU2KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNDEgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZUZpbHRlclVuaXRfMzA1NyhFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0NEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDQyID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVNdWx0aUZpbHRlclVuaXRfMzA1OChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUZpbHRlclVuaXQ0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNDMgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlUXVldWVkVW5pdF8zMDU5KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDYzID0gY3JlYXRlTGFiZWwoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTZXF1ZW50aWFsVW5pdF8zMDYwKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA2MiA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXRfMzA2MShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA0NCA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZU11bHRpRmVhdHVyZVVuaXRfMzA2MihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aUZlYXR1cmVVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDQ1ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0XzMwNjMoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA0NiA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlTXVsdGlGaWx0ZXJVbml0XzMwNjQoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDQ3ID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKE11bHRpRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfMzA2NShFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA2MSA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ29uZGl0aW9uYWxVbml0XzMwNjYoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA2MCA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzRWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2luZ2xlUXVldWVkVW5pdF8zMDY3KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0N0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDQ5ID0gY3JlYXRlTGFiZWwoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVBdG9taWNVbml0XzMwNjgoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQXRvbWljVW5pdDRFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA0OCA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlNEVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZVNlcXVlbnRpYWxVbml0XzMwNjkoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDU5ID0gY3JlYXRlTGFiZWwoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVTZXF1ZW50aWFsVW5pdF8zMDcwKEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuZ2V0U3R5bGVzKCkuYWRkKA0KKwkJCQlOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhpbnRlZERpYWdyYW1MaW5rU3R5bGUoKSk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA1OCA9IGNyZWF0ZUxhYmVsKA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ29uZGl0aW9uYWxVbml0XzMwNzEoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA1NyA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTVFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ29uZGl0aW9uYWxVbml0XzMwNzIoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA1NiA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ1RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlU2VxdWVudGlhbFVuaXRfMzA3MyhFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLmdldFN0eWxlcygpLmFkZCgNCisJCQkJTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIaW50ZWREaWFncmFtTGlua1N0eWxlKCkpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNTEgPSBjcmVhdGVMYWJlbCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQljcmVhdGVDb21wYXJ0bWVudCgNCisJCQkJbm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKFNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb2RlIGNyZWF0ZUF0b21pY1VuaXRfMzA3NChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShBdG9taWNVbml0NUVkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDUwID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKEF0b21pY1VuaXRMYWJlbFR5cGU1RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ29uZGl0aW9uYWxVbml0XzMwNzUoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5nZXRTdHlsZXMoKS5hZGQoDQorCQkJCU5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSGludGVkRGlhZ3JhbUxpbmtTdHlsZSgpKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKENvbmRpdGlvbmFsVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA1NSA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydC5WSVNVQUxfSUQpLA0KKwkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsNCisJCWNyZWF0ZUNvbXBhcnRtZW50KA0KKwkJCQlub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0LlZJU1VBTF9JRCksDQorCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOw0KKwkJY3JlYXRlQ29tcGFydG1lbnQoDQorCQkJCW5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2RWRpdFBhcnQuVklTVUFMX0lEKSwNCisJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQ29uZGl0aW9uQ2hlY2tfMzA3NihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCVNoYXBlIG5vZGUgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNoYXBlKCk7DQorCQlub2RlLnNldExheW91dENvbnN0cmFpbnQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKSk7DQorCQlub2RlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShDb25kaXRpb25DaGVja0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIG5vZGUsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJbm9kZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyANCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBub2RlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgbm9kZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKG5vZGVGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKG5vZGUsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZpbGxSR0IpKTsNCisJCU5vZGUgbGFiZWw1MDUyID0gY3JlYXRlTGFiZWwobm9kZSwNCisJCQkJQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkJCS5nZXRUeXBlKENvbmRpdGlvbkNoZWNrTmFtZVR5cGVTcGVjRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlyZXR1cm4gbm9kZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vZGUgY3JlYXRlQXRvbWljVW5pdF8zMDc3KEVPYmplY3QgZG9tYWluRWxlbWVudCwNCisJCQlWaWV3IGNvbnRhaW5lclZpZXcsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsDQorCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgew0KKwkJU2hhcGUgbm9kZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2hhcGUoKTsNCisJCW5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpKTsNCisJCW5vZGUuc2V0VHlwZShDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCS5nZXRUeXBlKEF0b21pY1VuaXQ2RWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgbm9kZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQlub2RlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzIA0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIG5vZGVGb250U3R5bGUgPSAoRm9udFN0eWxlKSBub2RlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAobm9kZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUobm9kZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikpOw0KKwkJTm9kZSBsYWJlbDUwNTMgPSBjcmVhdGVMYWJlbChub2RlLA0KKwkJCQlDb21yZWxWaXN1YWxJRFJlZ2lzdHJ5DQorCQkJCQkJLmdldFR5cGUoQXRvbWljVW5pdExhYmVsVHlwZTZFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCXJldHVybiBub2RlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm9kZSBjcmVhdGVBdG9taWNVbml0XzMwNzgoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlTaGFwZSBub2RlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaGFwZSgpOw0KKwkJbm9kZS5zZXRMYXlvdXRDb25zdHJhaW50KE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQm91bmRzKCkpOw0KKwkJbm9kZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoQXRvbWljVW5pdDdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBub2RlLCBpbmRleCwgcGVyc2lzdGVkKTsNCisJCW5vZGUuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVGcm9tUHJlZmVyZW5jZXMgDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgbm9kZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIG5vZGUNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChub2RlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCW5vZGVGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQlub2RlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJbm9kZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmaWxsUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZJTExfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShub2RlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7DQorCQlOb2RlIGxhYmVsNTA1NCA9IGNyZWF0ZUxhYmVsKG5vZGUsDQorCQkJCUNvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJCQkuZ2V0VHlwZShBdG9taWNVbml0TGFiZWxUeXBlN0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJcmV0dXJuIG5vZGU7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGdlIGNyZWF0ZVNpbmdsZVBvcnRNYXBwaW5nXzQwMDEoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlDb25uZWN0b3IgZWRnZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29ubmVjdG9yKCk7DQorCQllZGdlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsNCisJCVJlbGF0aXZlQmVuZHBvaW50cyBiZW5kcG9pbnRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlUmVsYXRpdmVCZW5kcG9pbnRzKCk7DQorCQlBcnJheUxpc3Q8UmVsYXRpdmVCZW5kcG9pbnQ+IHBvaW50cyA9IG5ldyBBcnJheUxpc3Q8UmVsYXRpdmVCZW5kcG9pbnQ+KA0KKwkJCQkyKTsNCisJCXBvaW50cy5hZGQobmV3IFJlbGF0aXZlQmVuZHBvaW50KCkpOw0KKwkJcG9pbnRzLmFkZChuZXcgUmVsYXRpdmVCZW5kcG9pbnQoKSk7DQorCQliZW5kcG9pbnRzLnNldFBvaW50cyhwb2ludHMpOw0KKwkJZWRnZS5zZXRCZW5kcG9pbnRzKGJlbmRwb2ludHMpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJZWRnZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydC5WSVNVQUxfSUQpKTsNCisJCWVkZ2Uuc2V0RWxlbWVudChkb21haW5FbGVtZW50KTsNCisJCS8vIGluaXRpYWxpemVQcmVmZXJlbmNlcw0KKwkJZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgcHJlZmVyZW5jZXNIaW50DQorCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCisNCisJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgbGluZVJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoDQorCQkJCXByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsNCisJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoZWRnZSwNCisJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCksDQorCQkJCUZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIobGluZVJHQikpOw0KKwkJRm9udFN0eWxlIGVkZ2VGb250U3R5bGUgPSAoRm9udFN0eWxlKSBlZGdlDQorCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7DQorCQlpZiAoZWRnZUZvbnRTdHlsZSAhPSBudWxsKSB7DQorCQkJRm9udERhdGEgZm9udERhdGEgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldEZvbnREYXRhKHByZWZTdG9yZSwNCisJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05UKTsNCisJCQllZGdlRm9udFN0eWxlLnNldEZvbnROYW1lKGZvbnREYXRhLmdldE5hbWUoKSk7DQorCQkJZWRnZUZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnREYXRhLmdldEhlaWdodCgpKTsNCisJCQllZGdlRm9udFN0eWxlLnNldEJvbGQoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7DQorCQkJZWRnZUZvbnRTdHlsZS5zZXRJdGFsaWMoKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsNCisJCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGZvbnRSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyDQorCQkJCQkuZ2V0Q29sb3IocHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0ZPTlRfQ09MT1IpOw0KKwkJCWVkZ2VGb250U3R5bGUuc2V0Rm9udENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZm9udFJHQikNCisJCQkJCS5pbnRWYWx1ZSgpKTsNCisJCX0NCisJCVJvdXRpbmcgcm91dGluZyA9IFJvdXRpbmcuZ2V0KHByZWZTdG9yZQ0KKwkJCQkuZ2V0SW50KElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9TVFlMRSkpOw0KKwkJaWYgKHJvdXRpbmcgIT0gbnVsbCkgew0KKwkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoZWRnZSwNCisJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um91dGluZ1N0eWxlX1JvdXRpbmcoKSwNCisJCQkJCXJvdXRpbmcpOw0KKwkJfQ0KKwkJcmV0dXJuIGVkZ2U7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFZGdlIGNyZWF0ZU11bHRpUG9ydE1hcHBpbmdfNDAwMihFT2JqZWN0IGRvbWFpbkVsZW1lbnQsDQorCQkJVmlldyBjb250YWluZXJWaWV3LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLA0KKwkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsNCisJCUNvbm5lY3RvciBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25uZWN0b3IoKTsNCisJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOw0KKwkJUmVsYXRpdmVCZW5kcG9pbnRzIGJlbmRwb2ludHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFDQorCQkJCS5jcmVhdGVSZWxhdGl2ZUJlbmRwb2ludHMoKTsNCisJCUFycmF5TGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4gcG9pbnRzID0gbmV3IEFycmF5TGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4oDQorCQkJCTIpOw0KKwkJcG9pbnRzLmFkZChuZXcgUmVsYXRpdmVCZW5kcG9pbnQoKSk7DQorCQlwb2ludHMuYWRkKG5ldyBSZWxhdGl2ZUJlbmRwb2ludCgpKTsNCisJCWJlbmRwb2ludHMuc2V0UG9pbnRzKHBvaW50cyk7DQorCQllZGdlLnNldEJlbmRwb2ludHMoYmVuZHBvaW50cyk7DQorCQlWaWV3VXRpbC5pbnNlcnRDaGlsZFZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgaW5kZXgsIHBlcnNpc3RlZCk7DQorCQllZGdlLnNldFR5cGUoQ29tcmVsVmlzdWFsSURSZWdpc3RyeQ0KKwkJCQkuZ2V0VHlwZShNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQuVklTVUFMX0lEKSk7DQorCQllZGdlLnNldEVsZW1lbnQoZG9tYWluRWxlbWVudCk7DQorCQkvLyBpbml0aWFsaXplUHJlZmVyZW5jZXMNCisJCWZpbmFsIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIHByZWZlcmVuY2VzSGludA0KKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQorDQorCQlvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCIGxpbmVSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKA0KKwkJCQlwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfTElORV9DT0xPUik7DQorCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKGVkZ2UsDQorCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLA0KKwkJCQlGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGxpbmVSR0IpKTsNCisJCUZvbnRTdHlsZSBlZGdlRm9udFN0eWxlID0gKEZvbnRTdHlsZSkgZWRnZQ0KKwkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOw0KKwkJaWYgKGVkZ2VGb250U3R5bGUgIT0gbnVsbCkgew0KKwkJCUZvbnREYXRhIGZvbnREYXRhID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRGb250RGF0YShwcmVmU3RvcmUsDQorCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RFRkFVTFRfRk9OVCk7DQorCQkJZWRnZUZvbnRTdHlsZS5zZXRGb250TmFtZShmb250RGF0YS5nZXROYW1lKCkpOw0KKwkJCWVkZ2VGb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250RGF0YS5nZXRIZWlnaHQoKSk7DQorCQkJZWRnZUZvbnRTdHlsZS5zZXRCb2xkKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOw0KKwkJCWVkZ2VGb250U3R5bGUuc2V0SXRhbGljKChmb250RGF0YS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7DQorCQkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBmb250UkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlcg0KKwkJCQkJLmdldENvbG9yKHByZWZTdG9yZSwgSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GT05UX0NPTE9SKTsNCisJCQllZGdlRm9udFN0eWxlLnNldEZvbnRDb2xvcihGaWd1cmVVdGlsaXRpZXMuUkdCVG9JbnRlZ2VyKGZvbnRSR0IpDQorCQkJCQkuaW50VmFsdWUoKSk7DQorCQl9DQorCQlSb3V0aW5nIHJvdXRpbmcgPSBSb3V0aW5nLmdldChwcmVmU3RvcmUNCisJCQkJLmdldEludChJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfU1RZTEUpKTsNCisJCWlmIChyb3V0aW5nICE9IG51bGwpIHsNCisJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKGVkZ2UsDQorCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFJvdXRpbmdTdHlsZV9Sb3V0aW5nKCksDQorCQkJCQlyb3V0aW5nKTsNCisJCX0NCisJCXJldHVybiBlZGdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRnZSBjcmVhdGVNdWx0aVNpbmdsZVBvcnRNYXBwaW5nXzQwMDMoRU9iamVjdCBkb21haW5FbGVtZW50LA0KKwkJCVZpZXcgY29udGFpbmVyVmlldywgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwNCisJCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7DQorCQlDb25uZWN0b3IgZWRnZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29ubmVjdG9yKCk7DQorCQllZGdlLmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsNCisJCVJlbGF0aXZlQmVuZHBvaW50cyBiZW5kcG9pbnRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRQ0KKwkJCQkuY3JlYXRlUmVsYXRpdmVCZW5kcG9pbnRzKCk7DQorCQlBcnJheUxpc3Q8UmVsYXRpdmVCZW5kcG9pbnQ+IHBvaW50cyA9IG5ldyBBcnJheUxpc3Q8UmVsYXRpdmVCZW5kcG9pbnQ+KA0KKwkJCQkyKTsNCisJCXBvaW50cy5hZGQobmV3IFJlbGF0aXZlQmVuZHBvaW50KCkpOw0KKwkJcG9pbnRzLmFkZChuZXcgUmVsYXRpdmVCZW5kcG9pbnQoKSk7DQorCQliZW5kcG9pbnRzLnNldFBvaW50cyhwb2ludHMpOw0KKwkJZWRnZS5zZXRCZW5kcG9pbnRzKGJlbmRwb2ludHMpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIGluZGV4LCBwZXJzaXN0ZWQpOw0KKwkJZWRnZS5zZXRUeXBlKENvbXJlbFZpc3VhbElEUmVnaXN0cnkNCisJCQkJLmdldFR5cGUoTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VkaXRQYXJ0LlZJU1VBTF9JRCkpOw0KKwkJZWRnZS5zZXRFbGVtZW50KGRvbWFpbkVsZW1lbnQpOw0KKwkJLy8gaW5pdGlhbGl6ZVByZWZlcmVuY2VzDQorCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQNCisJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KKw0KKwkJb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcigNCisJCQkJcHJlZlN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IpOw0KKwkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShlZGdlLA0KKwkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKSwNCisJCQkJRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKSk7DQorCQlGb250U3R5bGUgZWRnZUZvbnRTdHlsZSA9IChGb250U3R5bGUpIGVkZ2UNCisJCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsNCisJCWlmIChlZGdlRm9udFN0eWxlICE9IG51bGwpIHsNCisJCQlGb250RGF0YSBmb250RGF0YSA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHJlZlN0b3JlLA0KKwkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0ZPTlQpOw0KKwkJCWVkZ2VGb250U3R5bGUuc2V0Rm9udE5hbWUoZm9udERhdGEuZ2V0TmFtZSgpKTsNCisJCQllZGdlRm9udFN0eWxlLnNldEZvbnRIZWlnaHQoZm9udERhdGEuZ2V0SGVpZ2h0KCkpOw0KKwkJCWVkZ2VGb250U3R5bGUuc2V0Qm9sZCgoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsNCisJCQllZGdlRm9udFN0eWxlLnNldEl0YWxpYygoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOw0KKwkJCW9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IgZm9udFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXINCisJCQkJCS5nZXRDb2xvcihwcmVmU3RvcmUsIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRk9OVF9DT0xPUik7DQorCQkJZWRnZUZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQ0KKwkJCQkJLmludFZhbHVlKCkpOw0KKwkJfQ0KKwkJUm91dGluZyByb3V0aW5nID0gUm91dGluZy5nZXQocHJlZlN0b3JlDQorCQkJCS5nZXRJbnQoSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX1NUWUxFKSk7DQorCQlpZiAocm91dGluZyAhPSBudWxsKSB7DQorCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShlZGdlLA0KKwkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSb3V0aW5nU3R5bGVfUm91dGluZygpLA0KKwkJCQkJcm91dGluZyk7DQorCQl9DQorCQlyZXR1cm4gZWRnZTsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIHN0YW1wU2hvcnRjdXQoVmlldyBjb250YWluZXJWaWV3LCBOb2RlIHRhcmdldCkgew0KKwkJaWYgKCFDb21wb3NpdGVSZWZhY3RvcmluZ0VkaXRQYXJ0Lk1PREVMX0lEDQorCQkJCS5lcXVhbHMoQ29tcmVsVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgew0KKwkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UNCisJCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOw0KKwkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQNCisJCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgNCisJCQkJCSJtb2RlbElEIiwgQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQNCisJCQl0YXJnZXQuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgTm9kZSBjcmVhdGVMYWJlbChWaWV3IG93bmVyLCBTdHJpbmcgaGludCkgew0KKwkJRGVjb3JhdGlvbk5vZGUgcnYgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlY29yYXRpb25Ob2RlKCk7DQorCQlydi5zZXRUeXBlKGhpbnQpOw0KKwkJVmlld1V0aWwuaW5zZXJ0Q2hpbGRWaWV3KG93bmVyLCBydiwgVmlld1V0aWwuQVBQRU5ELCB0cnVlKTsNCisJCXJldHVybiBydjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBOb2RlIGNyZWF0ZUNvbXBhcnRtZW50KFZpZXcgb3duZXIsIFN0cmluZyBoaW50LA0KKwkJCWJvb2xlYW4gY2FuQ29sbGFwc2UsIGJvb2xlYW4gaGFzVGl0bGUsIGJvb2xlYW4gY2FuU29ydCwNCisJCQlib29sZWFuIGNhbkZpbHRlcikgew0KKwkJLy9TZW1hbnRpY0xpc3RDb21wYXJ0bWVudCBydiA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VtYW50aWNMaXN0Q29tcGFydG1lbnQoKTsNCisJCS8vcnYuc2V0U2hvd1RpdGxlKHNob3dUaXRsZSk7DQorCQkvL3J2LnNldENvbGxhcHNlZChpc0NvbGxhcHNlZCk7DQorCQlOb2RlIHJ2Ow0KKwkJaWYgKGNhbkNvbGxhcHNlKSB7DQorCQkJcnYgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJhc2ljQ29tcGFydG1lbnQoKTsNCisJCX0gZWxzZSB7DQorCQkJcnYgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlY29yYXRpb25Ob2RlKCk7DQorCQl9DQorCQlpZiAoaGFzVGl0bGUpIHsNCisJCQlUaXRsZVN0eWxlIHRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUaXRsZVN0eWxlKCk7DQorCQkJdHMuc2V0U2hvd1RpdGxlKHRydWUpOw0KKwkJCXJ2LmdldFN0eWxlcygpLmFkZCh0cyk7DQorCQl9DQorCQlpZiAoY2FuU29ydCkgew0KKwkJCXJ2LmdldFN0eWxlcygpLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNvcnRpbmdTdHlsZSgpKTsNCisJCX0NCisJCWlmIChjYW5GaWx0ZXIpIHsNCisJCQlydi5nZXRTdHlsZXMoKQ0KKwkJCQkJLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcmluZ1N0eWxlKCkpOw0KKwkJfQ0KKwkJcnYuc2V0VHlwZShoaW50KTsNCisJCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhvd25lciwgcnYsIFZpZXdVdGlsLkFQUEVORCwgdHJ1ZSk7DQorCQlyZXR1cm4gcnY7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIpIHsNCisJCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOw0KKwkJaWYgKGVPYmplY3QgIT0gbnVsbCkgew0KKwkJCXJldHVybiBFTUZDb3JlVXRpbC5yZXNvbHZlKA0KKwkJCQkJVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZU9iamVjdCksIGVPYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgSUVsZW1lbnRUeXBlIGdldFNlbWFudGljRWxlbWVudFR5cGUoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIpIHsNCisJCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgew0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjNhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnByb3ZpZGVyczsNCisNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxEaWFncmFtRWRpdG9yUGx1Z2luOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgRWxlbWVudEluaXRpYWxpemVycyB7DQorDQorCXByb3RlY3RlZCBFbGVtZW50SW5pdGlhbGl6ZXJzKCkgew0KKwkJLy8gdXNlICNnZXRJbnN0YW5jZSB0byBhY2Nlc3MgY2FjaGVkIGluc3RhbmNlDQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgRWxlbWVudEluaXRpYWxpemVycyBnZXRJbnN0YW5jZSgpIHsNCisJCUVsZW1lbnRJbml0aWFsaXplcnMgY2FjaGVkID0gQ29tcmVsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpDQorCQkJCS5nZXRFbGVtZW50SW5pdGlhbGl6ZXJzKCk7DQorCQlpZiAoY2FjaGVkID09IG51bGwpIHsNCisJCQlDb21yZWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2V0RWxlbWVudEluaXRpYWxpemVycygNCisJCQkJCWNhY2hlZCA9IG5ldyBFbGVtZW50SW5pdGlhbGl6ZXJzKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIGNhY2hlZDsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3NoZWV0L0NvbXJlbFByb3BlcnR5U2VjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9zaGVldC9Db21yZWxQcm9wZXJ0eVNlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ZmNjFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5kaWFncmFtL3NyYy9jb21yZWwvZGlhZ3JhbS9zaGVldC9Db21yZWxQcm9wZXJ0eVNlY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5kaWFncmFtLnNoZWV0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvcGVydGllcy5zZWN0aW9ucy5BZHZhbmNlZFByb3BlcnR5U2VjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCisNCisvKioNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbFByb3BlcnR5U2VjdGlvbiBleHRlbmRzIEFkdmFuY2VkUHJvcGVydHlTZWN0aW9uIGltcGxlbWVudHMNCisJCUlQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHsNCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQcm9wZXJ0eVNvdXJjZSkgew0KKwkJCXJldHVybiAoSVByb3BlcnR5U291cmNlKSBvYmplY3Q7DQorCQl9DQorCQlBZGFwdGVyRmFjdG9yeSBhZiA9IGdldEFkYXB0ZXJGYWN0b3J5KG9iamVjdCk7DQorCQlpZiAoYWYgIT0gbnVsbCkgew0KKwkJCUlJdGVtUHJvcGVydHlTb3VyY2UgaXBzID0gKElJdGVtUHJvcGVydHlTb3VyY2UpIGFmLmFkYXB0KG9iamVjdCwNCisJCQkJCUlJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOw0KKwkJCWlmIChpcHMgIT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gbmV3IFByb3BlcnR5U291cmNlKG9iamVjdCwgaXBzKTsNCisJCQl9DQorCQl9DQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgew0KKwkJCXJldHVybiAoSVByb3BlcnR5U291cmNlKSAoKElBZGFwdGFibGUpIG9iamVjdCkNCisJCQkJCS5nZXRBZGFwdGVyKElQcm9wZXJ0eVNvdXJjZS5jbGFzcyk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoKSB7DQorCQlyZXR1cm4gdGhpczsNCisJfQ0KKw0KKwkvKioNCisJICogTW9kaWZ5L3Vud3JhcCBzZWxlY3Rpb24uDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBPYmplY3QgdHJhbnNmb3JtU2VsZWN0aW9uKE9iamVjdCBzZWxlY3RlZCkgew0KKw0KKwkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsNCisJCQlPYmplY3QgbW9kZWwgPSAoKEVkaXRQYXJ0KSBzZWxlY3RlZCkuZ2V0TW9kZWwoKTsNCisJCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBWaWV3ID8gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpIDogbnVsbDsNCisJCX0NCisJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFZpZXcpIHsNCisJCQlyZXR1cm4gKChWaWV3KSBzZWxlY3RlZCkuZ2V0RWxlbWVudCgpOw0KKwkJfQ0KKwkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgew0KKwkJCVZpZXcgdmlldyA9IChWaWV3KSAoKElBZGFwdGFibGUpIHNlbGVjdGVkKS5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOw0KKwkJCWlmICh2aWV3ICE9IG51bGwpIHsNCisJCQkJcmV0dXJuIHZpZXcuZ2V0RWxlbWVudCgpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBzZWxlY3RlZDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpDQorCQkJCXx8IGZhbHNlID09IHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCisJCQlzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOw0KKwkJCXJldHVybjsNCisJCX0NCisJCWZpbmFsIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsNCisJCUFycmF5TGlzdCB0cmFuc2Zvcm1lZFNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoDQorCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpKTsNCisJCWZvciAoSXRlcmF0b3IgaXQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisJCQlPYmplY3QgciA9IHRyYW5zZm9ybVNlbGVjdGlvbihpdC5uZXh0KCkpOw0KKwkJCWlmIChyICE9IG51bGwpIHsNCisJCQkJdHJhbnNmb3JtZWRTZWxlY3Rpb24uYWRkKHIpOw0KKwkJCX0NCisJCX0NCisJCXN1cGVyLnNldElucHV0KHBhcnQsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRyYW5zZm9ybWVkU2VsZWN0aW9uKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeShPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoZ2V0RWRpdGluZ0RvbWFpbigpIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7DQorCQkJcmV0dXJuICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBnZXRFZGl0aW5nRG9tYWluKCkpDQorCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsNCisJCX0NCisJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwNCisJCQkJLmdldEVkaXRpbmdEb21haW4ob2JqZWN0KTsNCisJCWlmIChlZGl0aW5nRG9tYWluICE9IG51bGwpIHsNCisJCQlyZXR1cm4gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGVkaXRpbmdEb21haW4pDQorCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZGlhZ3JhbS9zcmMvY29tcmVsL2RpYWdyYW0vc2hlZXQvQ29tcmVsU2hlZXRMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3NoZWV0L0NvbXJlbFNoZWV0TGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NjRlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmRpYWdyYW0vc3JjL2NvbXJlbC9kaWFncmFtL3NoZWV0L0NvbXJlbFNoZWV0TGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZGlhZ3JhbS5zaGVldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5kaWFncmFtLm5hdmlnYXRvci5Db21yZWxOYXZpZ2F0b3JHcm91cDsNCitpbXBvcnQgY29tcmVsLmRpYWdyYW0ucGFydC5Db21yZWxWaXN1YWxJRFJlZ2lzdHJ5Ow0KK2ltcG9ydCBjb21yZWwuZGlhZ3JhbS5wcm92aWRlcnMuQ29tcmVsRWxlbWVudFR5cGVzOw0KKw0KKy8qKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsU2hlZXRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cw0KKwkJSUxhYmVsUHJvdmlkZXIgew0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7DQorCQllbGVtZW50ID0gdW53cmFwKGVsZW1lbnQpOw0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21yZWxOYXZpZ2F0b3JHcm91cCkgew0KKwkJCXJldHVybiAoKENvbXJlbE5hdmlnYXRvckdyb3VwKSBlbGVtZW50KS5nZXRHcm91cE5hbWUoKTsNCisJCX0NCisJCUlFbGVtZW50VHlwZSBldHlwZSA9IGdldEVsZW1lbnRUeXBlKGdldFZpZXcoZWxlbWVudCkpOw0KKwkJcmV0dXJuIGV0eXBlID09IG51bGwgPyAiIiA6IGV0eXBlLmdldERpc3BsYXlOYW1lKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgew0KKwkJSUVsZW1lbnRUeXBlIGV0eXBlID0gZ2V0RWxlbWVudFR5cGUoZ2V0Vmlldyh1bndyYXAoZWxlbWVudCkpKTsNCisJCXJldHVybiBldHlwZSA9PSBudWxsID8gbnVsbCA6IENvbXJlbEVsZW1lbnRUeXBlcy5nZXRJbWFnZShldHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgT2JqZWN0IHVud3JhcChPYmplY3QgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgew0KKwkJCXJldHVybiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlbGVtZW50KS5nZXRGaXJzdEVsZW1lbnQoKTsNCisJCX0NCisJCXJldHVybiBlbGVtZW50Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIFZpZXcgZ2V0VmlldyhPYmplY3QgZWxlbWVudCkgew0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7DQorCQkJcmV0dXJuIChWaWV3KSBlbGVtZW50Ow0KKwkJfQ0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7DQorCQkJcmV0dXJuIChWaWV3KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoVmlldyB2aWV3KSB7DQorCQkvLyBGb3IgaW50ZXJtZWRpYXRlIHZpZXdzIGNsaW1iIHVwIHRoZSBjb250YWlubWVudCBoaWVyYXJjaHkgdG8gZmluZCB0aGUgb25lIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IHR5cGUuDQorCQl3aGlsZSAodmlldyAhPSBudWxsKSB7DQorCQkJaW50IHZpZCA9IENvbXJlbFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7DQorCQkJSUVsZW1lbnRUeXBlIGV0eXBlID0gQ29tcmVsRWxlbWVudFR5cGVzLmdldEVsZW1lbnRUeXBlKHZpZCk7DQorCQkJaWYgKGV0eXBlICE9IG51bGwpIHsNCisJCQkJcmV0dXJuIGV0eXBlOw0KKwkJCX0NCisJCQl2aWV3ID0gdmlldy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBWaWV3ID8gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpDQorCQkJCQk6IG51bGw7DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmJjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGNsYXNzcGF0aD4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSmF2YVNFLTEuNiIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0Ly5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0Ly5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjFlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQ8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkMzM5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE0IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjANCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQorQnVuZGxlLU5hbWU6IENvTVJlTCBFZGl0DQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0O3NpbmdsZXRvbjo9dHJ1ZQ0KK0J1bmRsZS1WZXJzaW9uOiAwLjkuMA0KK0J1bmRsZS1DbGFzc1BhdGg6IC4NCitCdW5kbGUtQWN0aXZhdG9yOiBjb21yZWwucHJvdmlkZXIuQ29tcmVsRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbg0KK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS42DQorRXhwb3J0LVBhY2thZ2U6IGNvbXJlbC5wcm92aWRlcg0KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQorIG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWw7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLmVtZi5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0DQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvYmluLy5naXRpZ25vcmUgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvYmluLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4ZGJjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9iaW4vLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisvY29tcmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDIwODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisNCisjIDxjb3B5cmlnaHQ+DQorIyA8L2NvcHlyaWdodD4NCisjDQorIyAkSWQkDQorDQorYmluLmluY2x1ZGVzID0gLixcDQorICAgICAgICAgICAgICAgaWNvbnMvLFwNCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwNCisgICAgICAgICAgICAgICBzcmMvLFwNCisgICAgICAgICAgICAgICBiaW4vDQoramFycy5jb21waWxlLm9yZGVyID0gLg0KK3NvdXJjZS4uID0gc3JjLw0KK291dHB1dC4uID0gYmluLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXRvbWljVW5pdF9pbnB1dFBvcnRzX1NpbmdsZUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF0b21pY1VuaXRfaW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNmM5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF0b21pY1VuaXRfaW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZlYXR1cmVVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZlYXR1cmVVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njk0ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0X2hlbHBlclVuaXRzX011bHRpRmlsdGVyVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2Y2RhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9oZWxwZXJVbml0c19TaW5nbGVGZWF0dXJlVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTQ2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9oZWxwZXJVbml0c19TaW5nbGVGaWx0ZXJVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9oZWxwZXJVbml0c19TaW5nbGVGaWx0ZXJVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZkYTRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9tdWx0aUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0X211bHRpSW5wdXRQb3J0c19NdWx0aUlucHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5ZTg3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9tdWx0aUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQXRvbWljVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0F0b21pY1VuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmRhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQ2FydGVzaWFuUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMWZhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQ29uZGl0aW9uYWxVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQ29uZGl0aW9uYWxVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE0NjhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdF9Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQzZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdF9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfU2VxdWVudGlhbFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdF9TZXF1ZW50aWFsVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3ZDdjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfU2luZ2xlUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMmNlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdF9zaW5nbGVJbnB1dFBvcnRzX1NpbmdsZUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfc2luZ2xlSW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmM2MzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRfc2luZ2xlSW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfaGVscGVyX011bHRpRmVhdHVyZUhlbHBlci5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX2hlbHBlcl9NdWx0aUZlYXR1cmVIZWxwZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDY4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX2hlbHBlcl9NdWx0aUZlYXR1cmVIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfaGVscGVyX011bHRpRmlsdGVySGVscGVyLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfaGVscGVyX011bHRpRmlsdGVySGVscGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgyNmNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19oZWxwZXJfTXVsdGlGaWx0ZXJIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfaGVscGVyX1NpbmdsZUZlYXR1cmVIZWxwZXIuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19oZWxwZXJfU2luZ2xlRmVhdHVyZUhlbHBlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlZGMxMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfaGVscGVyX1NpbmdsZUZlYXR1cmVIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfaGVscGVyX1NpbmdsZUZpbHRlckhlbHBlci5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX2hlbHBlcl9TaW5nbGVGaWx0ZXJIZWxwZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjhlZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX2hlbHBlcl9TaW5nbGVGaWx0ZXJIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9BdG9taWNVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9BdG9taWNVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY0YjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19tYWluUmVmYWN0b3JpbmdVbml0X0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9DYXJ0ZXNpYW5RdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9DYXJ0ZXNpYW5RdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2JiOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19tYWluUmVmYWN0b3JpbmdVbml0X0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9Db25kaXRpb25hbFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19tYWluUmVmYWN0b3JpbmdVbml0X0NvbmRpdGlvbmFsVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExNjM4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19tYWluUmVmYWN0b3JpbmdVbml0X1BhcmFsbGVsUXVldWVkVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkZjUwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9TZXF1ZW50aWFsVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX21haW5SZWZhY3RvcmluZ1VuaXRfU2VxdWVudGlhbFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDhlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX21haW5SZWZhY3RvcmluZ1VuaXRfU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9TaW5nbGVRdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFpblJlZmFjdG9yaW5nVW5pdF9TaW5nbGVRdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRkMjAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19tYWluUmVmYWN0b3JpbmdVbml0X1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbW9kZWxSZWZhY3RvcmluZ3NfQ29tcG9zaXRlUmVmYWN0b3JpbmcuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19tb2RlbFJlZmFjdG9yaW5nc19Db21wb3NpdGVSZWZhY3RvcmluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxNGQ0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbW9kZWxSZWZhY3RvcmluZ3NfQ29tcG9zaXRlUmVmYWN0b3JpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfbW9kZWxSZWZhY3RvcmluZ3NfTW9kZWxSZWZhY3RvcmluZy5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX21vZGVsUmVmYWN0b3JpbmdzX01vZGVsUmVmYWN0b3JpbmcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDYwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nX21vZGVsUmVmYWN0b3JpbmdzX01vZGVsUmVmYWN0b3JpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfcG9ydE1hcHBpbmdzX011bHRpUG9ydE1hcHBpbmcuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19wb3J0TWFwcGluZ3NfTXVsdGlQb3J0TWFwcGluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkZjUwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfcG9ydE1hcHBpbmdzX011bHRpUG9ydE1hcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfcG9ydE1hcHBpbmdzX011bHRpU2luZ2xlUG9ydE1hcHBpbmcuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19wb3J0TWFwcGluZ3NfTXVsdGlTaW5nbGVQb3J0TWFwcGluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxODZlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfcG9ydE1hcHBpbmdzX011bHRpU2luZ2xlUG9ydE1hcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfcG9ydE1hcHBpbmdzX1NpbmdsZVBvcnRNYXBwaW5nLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdfcG9ydE1hcHBpbmdzX1NpbmdsZVBvcnRNYXBwaW5nLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTE0ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ19wb3J0TWFwcGluZ3NfU2luZ2xlUG9ydE1hcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfQXRvbWljVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9lbHNlX0F0b21pY1VuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWY5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9lbHNlX0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfQ2FydGVzaWFuUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9lbHNlX0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTBlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9lbHNlX0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfQ29uZGl0aW9uYWxVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfQ29uZGl0aW9uYWxVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdlNWUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfZWxzZV9Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI1NTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfZWxzZV9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfU2VxdWVudGlhbFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfZWxzZV9TZXF1ZW50aWFsVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4ODg1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2Vsc2VfU2luZ2xlUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9lbHNlX1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2RiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9lbHNlX1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfaGVscGVyVW5pdHNfTXVsdGlGZWF0dXJlVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4NTA2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX011bHRpRmlsdGVyVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjIzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZlYXR1cmVVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZlYXR1cmVVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdlNWUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmlsdGVyVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5Zjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2lmX0NvbmRpdGlvbkNoZWNrLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2lmX0NvbmRpdGlvbkNoZWNrLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI1NTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfaWZfQ29uZGl0aW9uQ2hlY2suZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2lucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfaW5wdXRQb3J0c19NdWx0aUlucHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZWI2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2lucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2lucHV0UG9ydHNfU2luZ2xlSW5wdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X2lucHV0UG9ydHNfU2luZ2xlSW5wdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhiMzgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfaW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fQXRvbWljVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF90aGVuX0F0b21pY1VuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWY5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF90aGVuX0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fQ2FydGVzaWFuUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF90aGVuX0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTBlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF90aGVuX0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fQ29uZGl0aW9uYWxVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fQ29uZGl0aW9uYWxVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdlNWUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfdGhlbl9Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fUGFyYWxsZWxRdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fUGFyYWxsZWxRdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI1NTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfdGhlbl9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fU2VxdWVudGlhbFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25kaXRpb25hbFVuaXRfdGhlbl9TZXF1ZW50aWFsVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4ODg1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZGl0aW9uYWxVbml0X3RoZW5fU2luZ2xlUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF90aGVuX1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2RiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmRpdGlvbmFsVW5pdF90aGVuX1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRmVhdHVyZUhlbHBlcl9pbnB1dFBvcnRfU2luZ2xlSW5wdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRmVhdHVyZUhlbHBlcl9pbnB1dFBvcnRfU2luZ2xlSW5wdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFiMzYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVGZWF0dXJlSGVscGVyX2lucHV0UG9ydF9TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRmVhdHVyZUhlbHBlcl9zZWNvbmRhcnlJbnB1dFBvcnRzX011bHRpSW5wdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRmVhdHVyZUhlbHBlcl9zZWNvbmRhcnlJbnB1dFBvcnRzX011bHRpSW5wdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y1MDYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVGZWF0dXJlSGVscGVyX3NlY29uZGFyeUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRmlsdGVySGVscGVyX2lucHV0UG9ydF9NdWx0aUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUZpbHRlckhlbHBlcl9pbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjEwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUZpbHRlckhlbHBlcl9pbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTW9kZWxSZWZhY3RvcmluZ19pbnB1dFBvcnRzX1NpbmdsZUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGVsUmVmYWN0b3JpbmdfaW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjM2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1vZGVsUmVmYWN0b3JpbmdfaW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGZWF0dXJlSGVscGVyX291dHB1dFBvcnRfTXVsdGlPdXRwdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGZWF0dXJlSGVscGVyX291dHB1dFBvcnRfTXVsdGlPdXRwdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzA0YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aUZlYXR1cmVIZWxwZXJfb3V0cHV0UG9ydF9NdWx0aU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGZWF0dXJlVW5pdF9pbnB1dFBvcnRfU2luZ2xlSW5wdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGZWF0dXJlVW5pdF9pbnB1dFBvcnRfU2luZ2xlSW5wdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzUyMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aUZlYXR1cmVVbml0X2lucHV0UG9ydF9TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGZWF0dXJlVW5pdF9vdXRwdXRQb3J0X011bHRpT3V0cHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpRmVhdHVyZVVuaXRfb3V0cHV0UG9ydF9NdWx0aU91dHB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjc5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpRmVhdHVyZVVuaXRfb3V0cHV0UG9ydF9NdWx0aU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGZWF0dXJlVW5pdF9zZWNvbmRhcnlJbnB1dFBvcnRzX011bHRpSW5wdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGZWF0dXJlVW5pdF9zZWNvbmRhcnlJbnB1dFBvcnRzX011bHRpSW5wdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTIxMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aUZlYXR1cmVVbml0X3NlY29uZGFyeUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGaWx0ZXJIZWxwZXJfb3V0cHV0UG9ydF9NdWx0aU91dHB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aUZpbHRlckhlbHBlcl9vdXRwdXRQb3J0X011bHRpT3V0cHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4MDdmYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGaWx0ZXJIZWxwZXJfb3V0cHV0UG9ydF9NdWx0aU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGaWx0ZXJVbml0X2lucHV0UG9ydF9NdWx0aUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpRmlsdGVyVW5pdF9pbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWZhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU11bHRpRmlsdGVyVW5pdF9pbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGaWx0ZXJVbml0X291dHB1dFBvcnRfTXVsdGlPdXRwdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTXVsdGlGaWx0ZXJVbml0X291dHB1dFBvcnRfTXVsdGlPdXRwdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTcxOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNdWx0aUZpbHRlclVuaXRfb3V0cHV0UG9ydF9NdWx0aU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfTXVsdGlGZWF0dXJlVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkYjBjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X2hlbHBlclVuaXRzX011bHRpRmlsdGVyVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGQ1ODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZlYXR1cmVVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZlYXR1cmVVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc4OTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmlsdGVyVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwMWM4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X211bHRpSW5wdXRQb3J0c19NdWx0aUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9tdWx0aUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2FiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9tdWx0aUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfQXRvbWljVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRzX0F0b21pY1VuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDFjODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRzX0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfQ2FydGVzaWFuUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRzX0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjM3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRzX0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfQ29uZGl0aW9uYWxVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfQ29uZGl0aW9uYWxVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc4OTMxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0c19Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGI0MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0c19QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfU2VxdWVudGlhbFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0c19TZXF1ZW50aWFsVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhYzZkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdHNfU2luZ2xlUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRzX1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDNkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRzX1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3NpbmdsZUlucHV0UG9ydHNfU2luZ2xlSW5wdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0X3NpbmdsZUlucHV0UG9ydHNfU2luZ2xlSW5wdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI3ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXRfc2luZ2xlSW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaGVscGVyVW5pdHNfTXVsdGlGZWF0dXJlVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjI1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaGVscGVyVW5pdHNfTXVsdGlGaWx0ZXJVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaGVscGVyVW5pdHNfTXVsdGlGaWx0ZXJVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJmMTYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9oZWxwZXJVbml0c19TaW5nbGVGZWF0dXJlVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1NDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmlsdGVyVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmFlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaW5wdXRQb3J0c19NdWx0aUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X2lucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmUxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X2lucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9pbnB1dFBvcnRzX1NpbmdsZUlucHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5ODdiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfaW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19BdG9taWNVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19BdG9taWNVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZhZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9yZWZhY3RvcmluZ1VuaXRzX0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19DYXJ0ZXNpYW5RdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19DYXJ0ZXNpYW5RdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjlkMGUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9yZWZhY3RvcmluZ1VuaXRzX0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19Db25kaXRpb25hbFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9yZWZhY3RvcmluZ1VuaXRzX0NvbmRpdGlvbmFsVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1NDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9yZWZhY3RvcmluZ1VuaXRzX1BhcmFsbGVsUXVldWVkVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1YjY1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19TZXF1ZW50aWFsVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X3JlZmFjdG9yaW5nVW5pdHNfU2VxdWVudGlhbFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjE5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcXVlbnRpYWxVbml0X3JlZmFjdG9yaW5nVW5pdHNfU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19TaW5nbGVRdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19TaW5nbGVRdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTcyYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXF1ZW50aWFsVW5pdF9yZWZhY3RvcmluZ1VuaXRzX1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmVhdHVyZUhlbHBlcl9vdXRwdXRQb3J0X1NpbmdsZU91dHB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVGZWF0dXJlSGVscGVyX291dHB1dFBvcnRfU2luZ2xlT3V0cHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhYjc1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmVhdHVyZUhlbHBlcl9vdXRwdXRQb3J0X1NpbmdsZU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmVhdHVyZVVuaXRfaW5wdXRQb3J0X1NpbmdsZUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZUZlYXR1cmVVbml0X2lucHV0UG9ydF9TaW5nbGVJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOGIzODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZUZlYXR1cmVVbml0X2lucHV0UG9ydF9TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmVhdHVyZVVuaXRfb3V0cHV0UG9ydF9TaW5nbGVPdXRwdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmVhdHVyZVVuaXRfb3V0cHV0UG9ydF9TaW5nbGVPdXRwdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNjMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVGZWF0dXJlVW5pdF9vdXRwdXRQb3J0X1NpbmdsZU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmVhdHVyZVVuaXRfc2Vjb25kYXJ5SW5wdXRQb3J0c19NdWx0aUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZUZlYXR1cmVVbml0X3NlY29uZGFyeUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGViNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZUZlYXR1cmVVbml0X3NlY29uZGFyeUlucHV0UG9ydHNfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmlsdGVySGVscGVyX291dHB1dFBvcnRfU2luZ2xlT3V0cHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZUZpbHRlckhlbHBlcl9vdXRwdXRQb3J0X1NpbmdsZU91dHB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmU1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZUZpbHRlckhlbHBlcl9vdXRwdXRQb3J0X1NpbmdsZU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmlsdGVyVW5pdF9pbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVGaWx0ZXJVbml0X2lucHV0UG9ydF9NdWx0aUlucHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MTE5MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmlsdGVyVW5pdF9pbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmlsdGVyVW5pdF9vdXRwdXRQb3J0X1NpbmdsZU91dHB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVGaWx0ZXJVbml0X291dHB1dFBvcnRfU2luZ2xlT3V0cHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxYmMwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlRmlsdGVyVW5pdF9vdXRwdXRQb3J0X1NpbmdsZU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZlYXR1cmVVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZlYXR1cmVVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E5ZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVRdWV1ZWRVbml0X2hlbHBlclVuaXRzX011bHRpRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVRdWV1ZWRVbml0X2hlbHBlclVuaXRzX011bHRpRmlsdGVyVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3NjNmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19NdWx0aUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19TaW5nbGVGZWF0dXJlVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjc1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19TaW5nbGVGaWx0ZXJVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19TaW5nbGVGaWx0ZXJVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQ2YWFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVRdWV1ZWRVbml0X2hlbHBlclVuaXRzX1NpbmdsZUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9tdWx0aUlucHV0UG9ydF9NdWx0aUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfbXVsdGlJbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDQ2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfbXVsdGlJbnB1dFBvcnRfTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQXRvbWljVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0F0b21pY1VuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDZhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQ2FydGVzaWFuUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjVhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQ29uZGl0aW9uYWxVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfQ29uZGl0aW9uYWxVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI3NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdF9Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfUGFyYWxsZWxRdWV1ZWRVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM2MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdF9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfU2VxdWVudGlhbFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTaW5nbGVRdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdF9TZXF1ZW50aWFsVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjNzExMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRfU2luZ2xlUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NjZkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2luZ2xlUXVldWVkVW5pdF9zaW5nbGVJbnB1dFBvcnRzX1NpbmdsZUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfc2luZ2xlSW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmM1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNpbmdsZVF1ZXVlZFVuaXRfc2luZ2xlSW5wdXRQb3J0c19TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0b21pY1VuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXRvbWljVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0b21pY1VuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2FydGVzaWFuUXVldWVkVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkYzVhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcnRlc2lhblF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJlZmFjdG9yaW5nLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJlZmFjdG9yaW5nLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTczMWZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9zaXRlUmVmYWN0b3JpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmRpdGlvbkNoZWNrLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmRpdGlvbkNoZWNrLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdjNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uZGl0aW9uQ2hlY2suZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmRpdGlvbmFsVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25kaXRpb25hbFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmFhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25kaXRpb25hbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L01vZGVsUmVmYWN0b3JpbmcuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTW9kZWxSZWZhY3RvcmluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MzQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L01vZGVsUmVmYWN0b3JpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpRmVhdHVyZUhlbHBlci5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NdWx0aUZlYXR1cmVIZWxwZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDU1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NdWx0aUZlYXR1cmVIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpRmVhdHVyZVVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlGZWF0dXJlVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkMjIyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpRmlsdGVySGVscGVyLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpRmlsdGVySGVscGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE4YWY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlGaWx0ZXJIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpRmlsdGVyVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NdWx0aUZpbHRlclVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDNiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NdWx0aUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpSW5wdXRQb3J0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpSW5wdXRQb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE3NTVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpT3V0cHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NdWx0aU91dHB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzcwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NdWx0aU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpUG9ydE1hcHBpbmcuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlQb3J0TWFwcGluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3YzQyOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpUG9ydE1hcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpU2luZ2xlUG9ydE1hcHBpbmcuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTXVsdGlTaW5nbGVQb3J0TWFwcGluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4NzQ3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L011bHRpU2luZ2xlUG9ydE1hcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhcmFsbGVsUXVldWVkVW5pdC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2M0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlcXVlbnRpYWxVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlcXVlbnRpYWxVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGUzY2YyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VxdWVudGlhbFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUZlYXR1cmVIZWxwZXIuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2luZ2xlRmVhdHVyZUhlbHBlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkMjIyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUZlYXR1cmVIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUZlYXR1cmVVbml0LmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUZlYXR1cmVVbml0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzJhYWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2luZ2xlRmVhdHVyZVVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUZpbHRlckhlbHBlci5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW5nbGVGaWx0ZXJIZWxwZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDNiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW5nbGVGaWx0ZXJIZWxwZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUZpbHRlclVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2luZ2xlRmlsdGVyVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUZpbHRlclVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZUlucHV0UG9ydC5naWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW5nbGVJbnB1dFBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YThhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW5nbGVJbnB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZU91dHB1dFBvcnQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2luZ2xlT3V0cHV0UG9ydC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4NTRlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZU91dHB1dFBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZVBvcnRNYXBwaW5nLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZVBvcnRNYXBwaW5nLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTczMWZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2luZ2xlUG9ydE1hcHBpbmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZVF1ZXVlZFVuaXQuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2luZ2xlUXVldWVkVW5pdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYWVkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbmdsZVF1ZXVlZFVuaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMwYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTY0IEBACisNCisjIDxjb3B5cmlnaHQ+DQorIyA8L2NvcHlyaWdodD4NCisjDQorIyAkSWQkDQorDQorcGx1Z2luTmFtZSA9IENvbXJlbCBFZGl0IFN1cHBvcnQNCitwcm92aWRlck5hbWUgPSB3d3cuZXhhbXBsZS5vcmcNCisNCitfVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KK19VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCitfVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCitfVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlDQorX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4NCitfVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50Lg0KKw0KK19VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBUaGUgezB9IG9mIHRoZSB7MX0NCisNCitfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfdHlwZSA9IENvbXBvc2l0ZSBSZWZhY3RvcmluZw0KK19VSV9OYW1lZEVsZW1lbnRfdHlwZSA9IE5hbWVkIEVsZW1lbnQNCitfVUlfRGVzY3JpYmVkRWxlbWVudF90eXBlID0gRGVzY3JpYmVkIEVsZW1lbnQNCitfVUlfUmVmYWN0b3JpbmdVbml0X3R5cGUgPSBSZWZhY3RvcmluZyBVbml0DQorX1VJX01vZGVsUmVmYWN0b3JpbmdfdHlwZSA9IE1vZGVsIFJlZmFjdG9yaW5nDQorX1VJX0F0b21pY1VuaXRfdHlwZSA9IEF0b21pYyBVbml0DQorX1VJX0NvbXBvc2l0ZVVuaXRfdHlwZSA9IENvbXBvc2l0ZSBVbml0DQorX1VJX1NlcXVlbnRpYWxVbml0X3R5cGUgPSBTZXF1ZW50aWFsIFVuaXQNCitfVUlfQ29uZGl0aW9uQ2hlY2tfdHlwZSA9IENvbmRpdGlvbiBDaGVjaw0KK19VSV9Db25kaXRpb25hbFVuaXRfdHlwZSA9IENvbmRpdGlvbmFsIFVuaXQNCitfVUlfUXVldWVkVW5pdF90eXBlID0gUXVldWVkIFVuaXQNCitfVUlfU2luZ2xlUXVldWVkVW5pdF90eXBlID0gU2luZ2xlIFF1ZXVlZCBVbml0DQorX1VJX1R3aWNlZFF1ZXVlZFVuaXRfdHlwZSA9IFR3aWNlZCBRdWV1ZWQgVW5pdA0KK19VSV9DYXJ0ZXNpYW5RdWV1ZWRVbml0X3R5cGUgPSBDYXJ0ZXNpYW4gUXVldWVkIFVuaXQNCitfVUlfUGFyYWxsZWxRdWV1ZWRVbml0X3R5cGUgPSBQYXJhbGxlbCBRdWV1ZWQgVW5pdA0KK19VSV9IZWxwZXJVbml0X3R5cGUgPSBIZWxwZXIgVW5pdA0KK19VSV9GZWF0dXJlVW5pdF90eXBlID0gRmVhdHVyZSBVbml0DQorX1VJX1NpbmdsZUZlYXR1cmVVbml0X3R5cGUgPSBTaW5nbGUgRmVhdHVyZSBVbml0DQorX1VJX011bHRpRmVhdHVyZVVuaXRfdHlwZSA9IE11bHRpIEZlYXR1cmUgVW5pdA0KK19VSV9GaWx0ZXJVbml0X3R5cGUgPSBGaWx0ZXIgVW5pdA0KK19VSV9TaW5nbGVGaWx0ZXJVbml0X3R5cGUgPSBTaW5nbGUgRmlsdGVyIFVuaXQNCitfVUlfTXVsdGlGaWx0ZXJVbml0X3R5cGUgPSBNdWx0aSBGaWx0ZXIgVW5pdA0KK19VSV9IZWxwZXJfdHlwZSA9IEhlbHBlcg0KK19VSV9GZWF0dXJlSGVscGVyX3R5cGUgPSBGZWF0dXJlIEhlbHBlcg0KK19VSV9TaW5nbGVGZWF0dXJlSGVscGVyX3R5cGUgPSBTaW5nbGUgRmVhdHVyZSBIZWxwZXINCitfVUlfTXVsdGlGZWF0dXJlSGVscGVyX3R5cGUgPSBNdWx0aSBGZWF0dXJlIEhlbHBlcg0KK19VSV9GaWx0ZXJIZWxwZXJfdHlwZSA9IEZpbHRlciBIZWxwZXINCitfVUlfU2luZ2xlRmlsdGVySGVscGVyX3R5cGUgPSBTaW5nbGUgRmlsdGVyIEhlbHBlcg0KK19VSV9NdWx0aUZpbHRlckhlbHBlcl90eXBlID0gTXVsdGkgRmlsdGVyIEhlbHBlcg0KK19VSV9Qb3J0X3R5cGUgPSBQb3J0DQorX1VJX1NpbmdsZVBvcnRfdHlwZSA9IFNpbmdsZSBQb3J0DQorX1VJX011bHRpUG9ydF90eXBlID0gTXVsdGkgUG9ydA0KK19VSV9JbnB1dFBvcnRfdHlwZSA9IElucHV0IFBvcnQNCitfVUlfT3V0cHV0UG9ydF90eXBlID0gT3V0cHV0IFBvcnQNCitfVUlfU2luZ2xlSW5wdXRQb3J0X3R5cGUgPSBTaW5nbGUgSW5wdXQgUG9ydA0KK19VSV9NdWx0aUlucHV0UG9ydF90eXBlID0gTXVsdGkgSW5wdXQgUG9ydA0KK19VSV9TaW5nbGVPdXRwdXRQb3J0X3R5cGUgPSBTaW5nbGUgT3V0cHV0IFBvcnQNCitfVUlfTXVsdGlPdXRwdXRQb3J0X3R5cGUgPSBNdWx0aSBPdXRwdXQgUG9ydA0KK19VSV9Qb3J0TWFwcGluZ190eXBlID0gUG9ydCBNYXBwaW5nDQorX1VJX1NpbmdsZVBvcnRNYXBwaW5nX3R5cGUgPSBTaW5nbGUgUG9ydCBNYXBwaW5nDQorX1VJX011bHRpUG9ydE1hcHBpbmdfdHlwZSA9IE11bHRpIFBvcnQgTWFwcGluZw0KK19VSV9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nX3R5cGUgPSBNdWx0aSBTaW5nbGUgUG9ydCBNYXBwaW5nDQorX1VJX1Vua25vd25fdHlwZSA9IE9iamVjdA0KKw0KK19VSV9Vbmtub3duX2RhdGF0eXBlPSBWYWx1ZQ0KKw0KK19VSV9Db21wb3NpdGVSZWZhY3RvcmluZ19tYWluUmVmYWN0b3JpbmdVbml0X2ZlYXR1cmUgPSBNYWluIFJlZmFjdG9yaW5nIFVuaXQNCitfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfcG9ydE1hcHBpbmdzX2ZlYXR1cmUgPSBQb3J0IE1hcHBpbmdzDQorX1VJX0NvbXBvc2l0ZVJlZmFjdG9yaW5nX21vZGVsUmVmYWN0b3JpbmdzX2ZlYXR1cmUgPSBNb2RlbCBSZWZhY3RvcmluZ3MNCitfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfaGVscGVyX2ZlYXR1cmUgPSBIZWxwZXINCitfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFwcGluZ1Zpc3VhbGl6YXRpb25fZmVhdHVyZSA9IE1hcHBpbmcgVmlzdWFsaXphdGlvbg0KK19VSV9Db21wb3NpdGVSZWZhY3RvcmluZ19jdXN0b21Jbml0aWFsQ29uZGl0aW9uX2ZlYXR1cmUgPSBDdXN0b20gSW5pdGlhbCBDb25kaXRpb24NCitfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfY3VzdG9tRmluYWxDb25kaXRpb25fZmVhdHVyZSA9IEN1c3RvbSBGaW5hbCBDb25kaXRpb24NCitfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IE5hbWUNCitfVUlfRGVzY3JpYmVkRWxlbWVudF9kZXNjcmlwdGlvbl9mZWF0dXJlID0gRGVzY3JpcHRpb24NCitfVUlfUmVmYWN0b3JpbmdVbml0X3NlcUV4ZWN1dGlvbk9yZGVyX2ZlYXR1cmUgPSBTZXEgRXhlY3V0aW9uIE9yZGVyDQorX1VJX01vZGVsUmVmYWN0b3JpbmdfcmVmSWRfZmVhdHVyZSA9IFJlZiBJZA0KK19VSV9Nb2RlbFJlZmFjdG9yaW5nX2xhYmVsX2ZlYXR1cmUgPSBMYWJlbA0KK19VSV9Nb2RlbFJlZmFjdG9yaW5nX25hbWVzcGFjZVVyaV9mZWF0dXJlID0gTmFtZXNwYWNlIFVyaQ0KK19VSV9Nb2RlbFJlZmFjdG9yaW5nX2lucHV0UG9ydHNfZmVhdHVyZSA9IElucHV0IFBvcnRzDQorX1VJX0F0b21pY1VuaXRfaW5wdXRQb3J0c19mZWF0dXJlID0gSW5wdXQgUG9ydHMNCitfVUlfQXRvbWljVW5pdF91bml0SWRfZmVhdHVyZSA9IFVuaXQgSWQNCitfVUlfQXRvbWljVW5pdF9sYWJlbF9mZWF0dXJlID0gTGFiZWwNCitfVUlfQXRvbWljVW5pdF9uYW1lc3BhY2VVcmlfZmVhdHVyZSA9IE5hbWVzcGFjZSBVcmkNCitfVUlfQXRvbWljVW5pdF90eXBlX2ZlYXR1cmUgPSBUeXBlDQorX1VJX0F0b21pY1VuaXRfbW9kZWxSZWZhY3RvcmluZ19mZWF0dXJlID0gTW9kZWwgUmVmYWN0b3JpbmcNCitfVUlfQXRvbWljVW5pdF9jaGVja0luaXRpYWxDb25kaXRpb25GbGFnX2ZlYXR1cmUgPSBDaGVjayBJbml0aWFsIENvbmRpdGlvbiBGbGFnDQorX1VJX0F0b21pY1VuaXRfY2hlY2tGaW5hbENvbmRpdGlvbkZsYWdfZmVhdHVyZSA9IENoZWNrIEZpbmFsIENvbmRpdGlvbiBGbGFnDQorX1VJX1NlcXVlbnRpYWxVbml0X2hlbHBlclVuaXRzX2ZlYXR1cmUgPSBIZWxwZXIgVW5pdHMNCitfVUlfU2VxdWVudGlhbFVuaXRfcmVmYWN0b3JpbmdVbml0c19mZWF0dXJlID0gUmVmYWN0b3JpbmcgVW5pdHMNCitfVUlfU2VxdWVudGlhbFVuaXRfaW5wdXRQb3J0c19mZWF0dXJlID0gSW5wdXQgUG9ydHMNCitfVUlfU2VxdWVudGlhbFVuaXRfc3RyaWN0X2ZlYXR1cmUgPSBTdHJpY3QNCitfVUlfU2VxdWVudGlhbFVuaXRfdHlwZV9mZWF0dXJlID0gVHlwZQ0KK19VSV9TZXF1ZW50aWFsVW5pdF9sYmxTdHJpY3RfZmVhdHVyZSA9IExibCBTdHJpY3QNCitfVUlfQ29uZGl0aW9uQ2hlY2tfdHlwZV9mZWF0dXJlID0gVHlwZQ0KK19VSV9Db25kaXRpb25DaGVja19zcGVjX2ZlYXR1cmUgPSBTcGVjDQorX1VJX0NvbmRpdGlvbmFsVW5pdF9pZl9mZWF0dXJlID0gSWYNCitfVUlfQ29uZGl0aW9uYWxVbml0X2hlbHBlclVuaXRzX2ZlYXR1cmUgPSBIZWxwZXIgVW5pdHMNCitfVUlfQ29uZGl0aW9uYWxVbml0X3RoZW5fZmVhdHVyZSA9IFRoZW4NCitfVUlfQ29uZGl0aW9uYWxVbml0X2Vsc2VfZmVhdHVyZSA9IEVsc2UNCitfVUlfQ29uZGl0aW9uYWxVbml0X2lucHV0UG9ydHNfZmVhdHVyZSA9IElucHV0IFBvcnRzDQorX1VJX0NvbmRpdGlvbmFsVW5pdF90eXBlX2ZlYXR1cmUgPSBUeXBlDQorX1VJX1F1ZXVlZFVuaXRfc3RyaWN0X2ZlYXR1cmUgPSBTdHJpY3QNCitfVUlfU2luZ2xlUXVldWVkVW5pdF9oZWxwZXJVbml0c19mZWF0dXJlID0gSGVscGVyIFVuaXRzDQorX1VJX1NpbmdsZVF1ZXVlZFVuaXRfcmVmYWN0b3JpbmdVbml0X2ZlYXR1cmUgPSBSZWZhY3RvcmluZyBVbml0DQorX1VJX1NpbmdsZVF1ZXVlZFVuaXRfc2luZ2xlSW5wdXRQb3J0c19mZWF0dXJlID0gU2luZ2xlIElucHV0IFBvcnRzDQorX1VJX1NpbmdsZVF1ZXVlZFVuaXRfbXVsdGlJbnB1dFBvcnRfZmVhdHVyZSA9IE11bHRpIElucHV0IFBvcnQNCitfVUlfU2luZ2xlUXVldWVkVW5pdF90eXBlX2ZlYXR1cmUgPSBUeXBlDQorX1VJX1NpbmdsZVF1ZXVlZFVuaXRfbGJsU3RyaWN0X2ZlYXR1cmUgPSBMYmwgU3RyaWN0DQorX1VJX0NhcnRlc2lhblF1ZXVlZFVuaXRfaGVscGVyVW5pdHNfZmVhdHVyZSA9IEhlbHBlciBVbml0cw0KK19VSV9DYXJ0ZXNpYW5RdWV1ZWRVbml0X3JlZmFjdG9yaW5nVW5pdF9mZWF0dXJlID0gUmVmYWN0b3JpbmcgVW5pdA0KK19VSV9DYXJ0ZXNpYW5RdWV1ZWRVbml0X3NpbmdsZUlucHV0UG9ydHNfZmVhdHVyZSA9IFNpbmdsZSBJbnB1dCBQb3J0cw0KK19VSV9DYXJ0ZXNpYW5RdWV1ZWRVbml0X211bHRpSW5wdXRQb3J0c19mZWF0dXJlID0gTXVsdGkgSW5wdXQgUG9ydHMNCitfVUlfQ2FydGVzaWFuUXVldWVkVW5pdF90eXBlX2ZlYXR1cmUgPSBUeXBlDQorX1VJX0NhcnRlc2lhblF1ZXVlZFVuaXRfbGJsU3RyaWN0X2ZlYXR1cmUgPSBMYmwgU3RyaWN0DQorX1VJX1BhcmFsbGVsUXVldWVkVW5pdF9oZWxwZXJVbml0c19mZWF0dXJlID0gSGVscGVyIFVuaXRzDQorX1VJX1BhcmFsbGVsUXVldWVkVW5pdF9yZWZhY3RvcmluZ1VuaXRzX2ZlYXR1cmUgPSBSZWZhY3RvcmluZyBVbml0cw0KK19VSV9QYXJhbGxlbFF1ZXVlZFVuaXRfc2luZ2xlSW5wdXRQb3J0c19mZWF0dXJlID0gU2luZ2xlIElucHV0IFBvcnRzDQorX1VJX1BhcmFsbGVsUXVldWVkVW5pdF9tdWx0aUlucHV0UG9ydHNfZmVhdHVyZSA9IE11bHRpIElucHV0IFBvcnRzDQorX1VJX1BhcmFsbGVsUXVldWVkVW5pdF90eXBlX2ZlYXR1cmUgPSBUeXBlDQorX1VJX1BhcmFsbGVsUXVldWVkVW5pdF9sYmxTdHJpY3RfZmVhdHVyZSA9IExibCBTdHJpY3QNCitfVUlfSGVscGVyVW5pdF9oZWxwZXJVbml0SWRfZmVhdHVyZSA9IEhlbHBlciBVbml0IElkDQorX1VJX0hlbHBlclVuaXRfbmFtZXNwYWNlVXJpX2ZlYXR1cmUgPSBOYW1lc3BhY2UgVXJpDQorX1VJX1NpbmdsZUZlYXR1cmVVbml0X2lucHV0UG9ydF9mZWF0dXJlID0gSW5wdXQgUG9ydA0KK19VSV9TaW5nbGVGZWF0dXJlVW5pdF9zZWNvbmRhcnlJbnB1dFBvcnRzX2ZlYXR1cmUgPSBTZWNvbmRhcnkgSW5wdXQgUG9ydHMNCitfVUlfU2luZ2xlRmVhdHVyZVVuaXRfb3V0cHV0UG9ydF9mZWF0dXJlID0gT3V0cHV0IFBvcnQNCitfVUlfU2luZ2xlRmVhdHVyZVVuaXRfc2luZ2xlRmVhdHVyZUhlbHBlcl9mZWF0dXJlID0gU2luZ2xlIEZlYXR1cmUgSGVscGVyDQorX1VJX1NpbmdsZUZlYXR1cmVVbml0X3R5cGVfZmVhdHVyZSA9IFR5cGUNCitfVUlfTXVsdGlGZWF0dXJlVW5pdF9pbnB1dFBvcnRfZmVhdHVyZSA9IElucHV0IFBvcnQNCitfVUlfTXVsdGlGZWF0dXJlVW5pdF9zZWNvbmRhcnlJbnB1dFBvcnRzX2ZlYXR1cmUgPSBTZWNvbmRhcnkgSW5wdXQgUG9ydHMNCitfVUlfTXVsdGlGZWF0dXJlVW5pdF9vdXRwdXRQb3J0X2ZlYXR1cmUgPSBPdXRwdXQgUG9ydA0KK19VSV9NdWx0aUZlYXR1cmVVbml0X211bHRpRmVhdHVyZUhlbHBlcl9mZWF0dXJlID0gTXVsdGkgRmVhdHVyZSBIZWxwZXINCitfVUlfTXVsdGlGZWF0dXJlVW5pdF90eXBlX2ZlYXR1cmUgPSBUeXBlDQorX1VJX1NpbmdsZUZpbHRlclVuaXRfaW5wdXRQb3J0X2ZlYXR1cmUgPSBJbnB1dCBQb3J0DQorX1VJX1NpbmdsZUZpbHRlclVuaXRfb3V0cHV0UG9ydF9mZWF0dXJlID0gT3V0cHV0IFBvcnQNCitfVUlfU2luZ2xlRmlsdGVyVW5pdF9zaW5nbGVGaWx0ZXJIZWxwZXJfZmVhdHVyZSA9IFNpbmdsZSBGaWx0ZXIgSGVscGVyDQorX1VJX1NpbmdsZUZpbHRlclVuaXRfdHlwZV9mZWF0dXJlID0gVHlwZQ0KK19VSV9NdWx0aUZpbHRlclVuaXRfaW5wdXRQb3J0X2ZlYXR1cmUgPSBJbnB1dCBQb3J0DQorX1VJX011bHRpRmlsdGVyVW5pdF9vdXRwdXRQb3J0X2ZlYXR1cmUgPSBPdXRwdXQgUG9ydA0KK19VSV9NdWx0aUZpbHRlclVuaXRfbXVsdGlGaWx0ZXJIZWxwZXJfZmVhdHVyZSA9IE11bHRpIEZpbHRlciBIZWxwZXINCitfVUlfTXVsdGlGaWx0ZXJVbml0X3R5cGVfZmVhdHVyZSA9IFR5cGUNCitfVUlfSGVscGVyX2hlbHBlcklkX2ZlYXR1cmUgPSBIZWxwZXIgSWQNCitfVUlfSGVscGVyX25hbWVzcGFjZVVyaV9mZWF0dXJlID0gTmFtZXNwYWNlIFVyaQ0KK19VSV9GZWF0dXJlSGVscGVyX2lucHV0UG9ydF9mZWF0dXJlID0gSW5wdXQgUG9ydA0KK19VSV9GZWF0dXJlSGVscGVyX3NlY29uZGFyeUlucHV0UG9ydHNfZmVhdHVyZSA9IFNlY29uZGFyeSBJbnB1dCBQb3J0cw0KK19VSV9TaW5nbGVGZWF0dXJlSGVscGVyX291dHB1dFBvcnRfZmVhdHVyZSA9IE91dHB1dCBQb3J0DQorX1VJX011bHRpRmVhdHVyZUhlbHBlcl9vdXRwdXRQb3J0X2ZlYXR1cmUgPSBPdXRwdXQgUG9ydA0KK19VSV9GaWx0ZXJIZWxwZXJfaW5wdXRQb3J0X2ZlYXR1cmUgPSBJbnB1dCBQb3J0DQorX1VJX1NpbmdsZUZpbHRlckhlbHBlcl9vdXRwdXRQb3J0X2ZlYXR1cmUgPSBPdXRwdXQgUG9ydA0KK19VSV9NdWx0aUZpbHRlckhlbHBlcl9vdXRwdXRQb3J0X2ZlYXR1cmUgPSBPdXRwdXQgUG9ydA0KK19VSV9Qb3J0X3R5cGVfZmVhdHVyZSA9IFR5cGUNCitfVUlfU2luZ2xlUG9ydF92YWx1ZV9mZWF0dXJlID0gVmFsdWUNCitfVUlfTXVsdGlQb3J0X3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQ0KK19VSV9TaW5nbGVQb3J0TWFwcGluZ19zb3VyY2VfZmVhdHVyZSA9IFNvdXJjZQ0KK19VSV9TaW5nbGVQb3J0TWFwcGluZ190YXJnZXRfZmVhdHVyZSA9IFRhcmdldA0KK19VSV9NdWx0aVBvcnRNYXBwaW5nX3NvdXJjZV9mZWF0dXJlID0gU291cmNlDQorX1VJX011bHRpUG9ydE1hcHBpbmdfdGFyZ2V0X2ZlYXR1cmUgPSBUYXJnZXQNCitfVUlfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ19zb3VyY2VfZmVhdHVyZSA9IFNvdXJjZQ0KK19VSV9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nX3RhcmdldF9mZWF0dXJlID0gVGFyZ2V0DQorX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkDQorDQorX1VJX01hcHBpbmdWaXN1YWxpemF0aW9uX2Fycm93c19saXRlcmFsID0gYXJyb3dzDQorX1VJX01hcHBpbmdWaXN1YWxpemF0aW9uX2NvbG9yZWRQb3J0c19saXRlcmFsID0gY29sb3JlZFBvcnRzDQorX1VJX01hcHBpbmdWaXN1YWxpemF0aW9uX2luZGljZXNfbGl0ZXJhbCA9IGluZGljZXMNCitfVUlfTWFwcGluZ1Zpc3VhbGl6YXRpb25fYXJyb3dzQW5kQ29sb3JlZFBvcnRzX2xpdGVyYWwgPSBhcnJvd3NBbmRDb2xvcmVkUG9ydHMNCitfVUlfTWFwcGluZ1Zpc3VhbGl6YXRpb25fYXJyb3dzQW5kSW5kaWNlc19saXRlcmFsID0gYXJyb3dzQW5kSW5kaWNlcw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxM2RjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KKw0KKzwhLS0NCisgPGNvcHlyaWdodD4NCisgPC9jb3B5cmlnaHQ+DQorDQorICRJZCQNCistLT4NCisNCis8cGx1Z2luPg0KKw0KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPg0KKyAgICAgIDxmYWN0b3J5DQorICAgICAgICAgICAgdXJpPSJodHRwOi8vY29tcmVsLzAuMSINCisgICAgICAgICAgICBjbGFzcz0iY29tcmVsLnByb3ZpZGVyLkNvbXJlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ig0KKyAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQ0KKyAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyDQorICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKw0KKzwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0F0b21pY1VuaXRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0F0b21pY1VuaXRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGYxNDJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQXRvbWljVW5pdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzMxIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLkF0b21pY1VuaXR9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXRvbWljVW5pdEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFJlZmFjdG9yaW5nVW5pdEl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEF0b21pY1VuaXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkVW5pdElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkTGFiZWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGROYW1lc3BhY2VVcmlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkTW9kZWxSZWZhY3RvcmluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZENoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVW5pdCBJZCBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkVW5pdElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9BdG9taWNVbml0X3VuaXRJZF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F0b21pY1VuaXRfdW5pdElkX2ZlYXR1cmUiLCAiX1VJX0F0b21pY1VuaXRfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5BVE9NSUNfVU5JVF9fVU5JVF9JRCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhYmVsIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRMYWJlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXRvbWljVW5pdF9sYWJlbF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F0b21pY1VuaXRfbGFiZWxfZmVhdHVyZSIsICJfVUlfQXRvbWljVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkFUT01JQ19VTklUX19MQUJFTCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWVzcGFjZSBVcmkgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZVVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQXRvbWljVW5pdF9uYW1lc3BhY2VVcmlfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdG9taWNVbml0X25hbWVzcGFjZVVyaV9mZWF0dXJlIiwgIl9VSV9BdG9taWNVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQVRPTUlDX1VOSVRfX05BTUVTUEFDRV9VUkksDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9BdG9taWNVbml0X3R5cGVfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdG9taWNVbml0X3R5cGVfZmVhdHVyZSIsICJfVUlfQXRvbWljVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkFUT01JQ19VTklUX19UWVBFLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZGVsIFJlZmFjdG9yaW5nIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RlbFJlZmFjdG9yaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9BdG9taWNVbml0X21vZGVsUmVmYWN0b3JpbmdfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdG9taWNVbml0X21vZGVsUmVmYWN0b3JpbmdfZmVhdHVyZSIsICJfVUlfQXRvbWljVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkFUT01JQ19VTklUX19NT0RFTF9SRUZBQ1RPUklORywNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIHRydWUsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoZWNrIEluaXRpYWwgQ29uZGl0aW9uIEZsYWcgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZENoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0F0b21pY1VuaXRfY2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZ19mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F0b21pY1VuaXRfY2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZ19mZWF0dXJlIiwgIl9VSV9BdG9taWNVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQVRPTUlDX1VOSVRfX0NIRUNLX0lOSVRJQUxfQ09ORElUSU9OX0ZMQUcsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGVjayBGaW5hbCBDb25kaXRpb24gRmxhZyBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0F0b21pY1VuaXRfY2hlY2tGaW5hbENvbmRpdGlvbkZsYWdfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BdG9taWNVbml0X2NoZWNrRmluYWxDb25kaXRpb25GbGFnX2ZlYXR1cmUiLCAiX1VJX0F0b21pY1VuaXRfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5BVE9NSUNfVU5JVF9fQ0hFQ0tfRklOQUxfQ09ORElUSU9OX0ZMQUcsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5BVE9NSUNfVU5JVF9fSU5QVVRfUE9SVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQorCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgQXRvbWljVW5pdC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQXRvbWljVW5pdCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChBdG9taWNVbml0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfQXRvbWljVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX0F0b21pY1VuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdG9taWNVbml0LmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fVU5JVF9JRDoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0xBQkVMOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fTkFNRVNQQUNFX1VSSToNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX1RZUEU6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19DSEVDS19JTklUSUFMX0NPTkRJVElPTl9GTEFHOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fQ0hFQ0tfRklOQUxfQ09ORElUSU9OX0ZMQUc6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fSU5QVVRfUE9SVFM6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5BVE9NSUNfVU5JVF9fSU5QVVRfUE9SVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKSkpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0NhcnRlc2lhblF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0NhcnRlc2lhblF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdlZjJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ2FydGVzaWFuUXVldWVkVW5pdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjczIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXR9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFR3aWNlZFF1ZXVlZFVuaXRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRMYmxTdHJpY3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0NhcnRlc2lhblF1ZXVlZFVuaXRfdHlwZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NhcnRlc2lhblF1ZXVlZFVuaXRfdHlwZV9mZWF0dXJlIiwgIl9VSV9DYXJ0ZXNpYW5RdWV1ZWRVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19UWVBFLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExibCBTdHJpY3QgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZExibFN0cmljdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQ2FydGVzaWFuUXVldWVkVW5pdF9sYmxTdHJpY3RfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9DYXJ0ZXNpYW5RdWV1ZWRVbml0X2xibFN0cmljdF9mZWF0dXJlIiwgIl9VSV9DYXJ0ZXNpYW5RdWV1ZWRVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19MQkxfU1RSSUNULA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQorCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgQ2FydGVzaWFuUXVldWVkVW5pdC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ2FydGVzaWFuUXVldWVkVW5pdCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChDYXJ0ZXNpYW5RdWV1ZWRVbml0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfQ2FydGVzaWFuUXVldWVkVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX0NhcnRlc2lhblF1ZXVlZFVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDYXJ0ZXNpYW5RdWV1ZWRVbml0LmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1RZUEU6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlRTOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVGZWF0dXJlVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpRmVhdHVyZVVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVGaWx0ZXJVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0b21pY1VuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VxdWVudGlhbFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uZGl0aW9uYWxVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCkpKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Db21wb3NpdGVSZWZhY3RvcmluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQ4Y2RjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDMxMiBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmd9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBNb2RlbFJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkTWFwcGluZ1Zpc3VhbGl6YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRDdXN0b21Jbml0aWFsQ29uZGl0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkQ3VzdG9tRmluYWxDb25kaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hcHBpbmcgVmlzdWFsaXphdGlvbiBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZ1Zpc3VhbGl6YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0NvbXBvc2l0ZVJlZmFjdG9yaW5nX21hcHBpbmdWaXN1YWxpemF0aW9uX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfbWFwcGluZ1Zpc3VhbGl6YXRpb25fZmVhdHVyZSIsICJfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BUFBJTkdfVklTVUFMSVpBVElPTiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1c3RvbSBJbml0aWFsIENvbmRpdGlvbiBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkQ3VzdG9tSW5pdGlhbENvbmRpdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfY3VzdG9tSW5pdGlhbENvbmRpdGlvbl9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbXBvc2l0ZVJlZmFjdG9yaW5nX2N1c3RvbUluaXRpYWxDb25kaXRpb25fZmVhdHVyZSIsICJfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX0NVU1RPTV9JTklUSUFMX0NPTkRJVElPTiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEN1c3RvbSBGaW5hbCBDb25kaXRpb24gZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUZpbmFsQ29uZGl0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSZWZhY3RvcmluZ19jdXN0b21GaW5hbENvbmRpdGlvbl9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbXBvc2l0ZVJlZmFjdG9yaW5nX2N1c3RvbUZpbmFsQ29uZGl0aW9uX2ZlYXR1cmUiLCAiX1VJX0NvbXBvc2l0ZVJlZmFjdG9yaW5nX3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fRklOQUxfQ09ORElUSU9OLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19QT1JUX01BUFBJTkdTKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fTU9ERUxfUkVGQUNUT1JJTkdTKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fSEVMUEVSKTsNCisJCX0NCisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KKw0KKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIENvbXBvc2l0ZVJlZmFjdG9yaW5nLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db21wb3NpdGVSZWZhY3RvcmluZyIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChDb21wb3NpdGVSZWZhY3RvcmluZylvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX0NvbXBvc2l0ZVJlZmFjdG9yaW5nX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlUmVmYWN0b3JpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb21wb3NpdGVSZWZhY3RvcmluZy5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQVBQSU5HX1ZJU1VBTElaQVRJT046DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fQ1VTVE9NX0lOSVRJQUxfQ09ORElUSU9OOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX0NVU1RPTV9GSU5BTF9DT05ESVRJT046DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BSU5fUkVGQUNUT1JJTkdfVU5JVDoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19QT1JUX01BUFBJTkdTOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01PREVMX1JFRkFDVE9SSU5HUzoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19IRUxQRVI6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BSU5fUkVGQUNUT1JJTkdfVU5JVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0b21pY1VuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BSU5fUkVGQUNUT1JJTkdfVU5JVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmRpdGlvbmFsVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BSU5fUkVGQUNUT1JJTkdfVU5JVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fTUFJTl9SRUZBQ1RPUklOR19VTklULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fUE9SVF9NQVBQSU5HUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZVBvcnRNYXBwaW5nKCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fUE9SVF9NQVBQSU5HUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpUG9ydE1hcHBpbmcoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19QT1JUX01BUFBJTkdTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlTaW5nbGVQb3J0TWFwcGluZygpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01PREVMX1JFRkFDVE9SSU5HUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1vZGVsUmVmYWN0b3JpbmcoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NT0RFTF9SRUZBQ1RPUklOR1MsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZygpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX0hFTFBFUiwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUZlYXR1cmVIZWxwZXIoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19IRUxQRVIsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUZlYXR1cmVIZWxwZXIoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19IRUxQRVIsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVGaWx0ZXJIZWxwZXIoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19IRUxQRVIsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUZpbHRlckhlbHBlcigpKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ29tcG9zaXRlVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ29tcG9zaXRlVW5pdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZmI4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Db21wb3NpdGVVbml0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5Db21wb3NpdGVVbml0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXBvc2l0ZVVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBSZWZhY3RvcmluZ1VuaXRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21wb3NpdGVVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKENvbXBvc2l0ZVVuaXQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVVbml0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlVW5pdF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ29tcmVsRWRpdFBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ29tcmVsRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2Y2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Db21yZWxFZGl0UGx1Z2luLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBDb21yZWwgZWRpdCBwbHVnaW4uDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIENvbXJlbEVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gew0KKwkvKioNCisJICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb21yZWxFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IENvbXJlbEVkaXRQbHVnaW4oKTsNCisNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcmVsRWRpdFBsdWdpbigpIHsNCisJCXN1cGVyDQorCQkgIChuZXcgUmVzb3VyY2VMb2NhdG9yIFtdIHsNCisJCSAgIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgew0KKwkJCXN1cGVyKCk7DQorDQorCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4NCisJCQkvLw0KKwkJCXBsdWdpbiA9IHRoaXM7DQorCQl9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvQ29tcmVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0NvbXJlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1MjQyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0NvbXJlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3NTUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQoraW1wb3J0IGNvbXJlbC51dGlsLkNvbXJlbEFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4NCisgKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4NCisgKiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLg0KKyAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBDb21yZWxBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgew0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KKw0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KKwkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQorCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsNCisJCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmd9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21wb3NpdGVSZWZhY3RvcmluZ0l0ZW1Qcm92aWRlciBjb21wb3NpdGVSZWZhY3RvcmluZ0l0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmd9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJlZmFjdG9yaW5nQWRhcHRlcigpIHsNCisJCWlmIChjb21wb3NpdGVSZWZhY3RvcmluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJY29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gY29tcG9zaXRlUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3Jpbmd9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNb2RlbFJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyIG1vZGVsUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3Jpbmd9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGVsUmVmYWN0b3JpbmdBZGFwdGVyKCkgew0KKwkJaWYgKG1vZGVsUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCW1vZGVsUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTW9kZWxSZWZhY3RvcmluZ0l0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBtb2RlbFJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5BdG9taWNVbml0fSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQXRvbWljVW5pdEl0ZW1Qcm92aWRlciBhdG9taWNVbml0SXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5BdG9taWNVbml0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdG9taWNVbml0QWRhcHRlcigpIHsNCisJCWlmIChhdG9taWNVbml0SXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlhdG9taWNVbml0SXRlbVByb3ZpZGVyID0gbmV3IEF0b21pY1VuaXRJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gYXRvbWljVW5pdEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTZXF1ZW50aWFsVW5pdEl0ZW1Qcm92aWRlciBzZXF1ZW50aWFsVW5pdEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcXVlbnRpYWxVbml0QWRhcHRlcigpIHsNCisJCWlmIChzZXF1ZW50aWFsVW5pdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc2VxdWVudGlhbFVuaXRJdGVtUHJvdmlkZXIgPSBuZXcgU2VxdWVudGlhbFVuaXRJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc2VxdWVudGlhbFVuaXRJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLkNvbmRpdGlvbkNoZWNrfSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29uZGl0aW9uQ2hlY2tJdGVtUHJvdmlkZXIgY29uZGl0aW9uQ2hlY2tJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLkNvbmRpdGlvbkNoZWNrfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25kaXRpb25DaGVja0FkYXB0ZXIoKSB7DQorCQlpZiAoY29uZGl0aW9uQ2hlY2tJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCWNvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyID0gbmV3IENvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIGNvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb25kaXRpb25hbFVuaXRJdGVtUHJvdmlkZXIgY29uZGl0aW9uYWxVbml0SXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmRpdGlvbmFsVW5pdEFkYXB0ZXIoKSB7DQorCQlpZiAoY29uZGl0aW9uYWxVbml0SXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQljb25kaXRpb25hbFVuaXRJdGVtUHJvdmlkZXIgPSBuZXcgQ29uZGl0aW9uYWxVbml0SXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIGNvbmRpdGlvbmFsVW5pdEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuU2luZ2xlUXVldWVkVW5pdH0gaW5zdGFuY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZVF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIgc2luZ2xlUXVldWVkVW5pdEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2luZ2xlUXVldWVkVW5pdH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2luZ2xlUXVldWVkVW5pdEFkYXB0ZXIoKSB7DQorCQlpZiAoc2luZ2xlUXVldWVkVW5pdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc2luZ2xlUXVldWVkVW5pdEl0ZW1Qcm92aWRlciA9IG5ldyBTaW5nbGVRdWV1ZWRVbml0SXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHNpbmdsZVF1ZXVlZFVuaXRJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDYXJ0ZXNpYW5RdWV1ZWRVbml0SXRlbVByb3ZpZGVyIGNhcnRlc2lhblF1ZXVlZFVuaXRJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXRBZGFwdGVyKCkgew0KKwkJaWYgKGNhcnRlc2lhblF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCWNhcnRlc2lhblF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIgPSBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdEl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBjYXJ0ZXNpYW5RdWV1ZWRVbml0SXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBQYXJhbGxlbFF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIgcGFyYWxsZWxRdWV1ZWRVbml0SXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdEFkYXB0ZXIoKSB7DQorCQlpZiAocGFyYWxsZWxRdWV1ZWRVbml0SXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlwYXJhbGxlbFF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIgPSBuZXcgUGFyYWxsZWxRdWV1ZWRVbml0SXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHBhcmFsbGVsUXVldWVkVW5pdEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlciBzaW5nbGVGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0QWRhcHRlcigpIHsNCisJCWlmIChzaW5nbGVGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc2luZ2xlRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc2luZ2xlRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLk11bHRpRmVhdHVyZVVuaXR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUZlYXR1cmVVbml0SXRlbVByb3ZpZGVyIG11bHRpRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpRmVhdHVyZVVuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpRmVhdHVyZVVuaXRBZGFwdGVyKCkgew0KKwkJaWYgKG11bHRpRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCW11bHRpRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIgPSBuZXcgTXVsdGlGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBtdWx0aUZlYXR1cmVVbml0SXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0fSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlRmlsdGVyVW5pdEl0ZW1Qcm92aWRlciBzaW5nbGVGaWx0ZXJVbml0SXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0QWRhcHRlcigpIHsNCisJCWlmIChzaW5nbGVGaWx0ZXJVbml0SXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlzaW5nbGVGaWx0ZXJVbml0SXRlbVByb3ZpZGVyID0gbmV3IFNpbmdsZUZpbHRlclVuaXRJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc2luZ2xlRmlsdGVyVW5pdEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJVbml0fSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlGaWx0ZXJVbml0SXRlbVByb3ZpZGVyIG11bHRpRmlsdGVyVW5pdEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJVbml0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aUZpbHRlclVuaXRBZGFwdGVyKCkgew0KKwkJaWYgKG11bHRpRmlsdGVyVW5pdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJbXVsdGlGaWx0ZXJVbml0SXRlbVByb3ZpZGVyID0gbmV3IE11bHRpRmlsdGVyVW5pdEl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBtdWx0aUZpbHRlclVuaXRJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXJ9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyIHNpbmdsZUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZUZlYXR1cmVIZWxwZXJBZGFwdGVyKCkgew0KKwkJaWYgKHNpbmdsZUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCXNpbmdsZUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIgPSBuZXcgU2luZ2xlRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBzaW5nbGVGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXJ9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIgbXVsdGlGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpRmVhdHVyZUhlbHBlckFkYXB0ZXIoKSB7DQorCQlpZiAobXVsdGlGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQltdWx0aUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIgPSBuZXcgTXVsdGlGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIG11bHRpRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyfSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlRmlsdGVySGVscGVySXRlbVByb3ZpZGVyIHNpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTaW5nbGVGaWx0ZXJIZWxwZXJBZGFwdGVyKCkgew0KKwkJaWYgKHNpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc2luZ2xlRmlsdGVySGVscGVySXRlbVByb3ZpZGVyID0gbmV3IFNpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBzaW5nbGVGaWx0ZXJIZWxwZXJJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLk11bHRpRmlsdGVySGVscGVyfSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlGaWx0ZXJIZWxwZXJJdGVtUHJvdmlkZXIgbXVsdGlGaWx0ZXJIZWxwZXJJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpRmlsdGVySGVscGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aUZpbHRlckhlbHBlckFkYXB0ZXIoKSB7DQorCQlpZiAobXVsdGlGaWx0ZXJIZWxwZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCW11bHRpRmlsdGVySGVscGVySXRlbVByb3ZpZGVyID0gbmV3IE11bHRpRmlsdGVySGVscGVySXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIG11bHRpRmlsdGVySGVscGVySXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5TaW5nbGVJbnB1dFBvcnR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVJbnB1dFBvcnRJdGVtUHJvdmlkZXIgc2luZ2xlSW5wdXRQb3J0SXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5TaW5nbGVJbnB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZUlucHV0UG9ydEFkYXB0ZXIoKSB7DQorCQlpZiAoc2luZ2xlSW5wdXRQb3J0SXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQlzaW5nbGVJbnB1dFBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgU2luZ2xlSW5wdXRQb3J0SXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHNpbmdsZUlucHV0UG9ydEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuTXVsdGlJbnB1dFBvcnR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUlucHV0UG9ydEl0ZW1Qcm92aWRlciBtdWx0aUlucHV0UG9ydEl0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuTXVsdGlJbnB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpSW5wdXRQb3J0QWRhcHRlcigpIHsNCisJCWlmIChtdWx0aUlucHV0UG9ydEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJbXVsdGlJbnB1dFBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgTXVsdGlJbnB1dFBvcnRJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gbXVsdGlJbnB1dFBvcnRJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLlNpbmdsZU91dHB1dFBvcnR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVPdXRwdXRQb3J0SXRlbVByb3ZpZGVyIHNpbmdsZU91dHB1dFBvcnRJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLlNpbmdsZU91dHB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZU91dHB1dFBvcnRBZGFwdGVyKCkgew0KKwkJaWYgKHNpbmdsZU91dHB1dFBvcnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCXNpbmdsZU91dHB1dFBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgU2luZ2xlT3V0cHV0UG9ydEl0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBzaW5nbGVPdXRwdXRQb3J0SXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5NdWx0aU91dHB1dFBvcnR9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aU91dHB1dFBvcnRJdGVtUHJvdmlkZXIgbXVsdGlPdXRwdXRQb3J0SXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5NdWx0aU91dHB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpT3V0cHV0UG9ydEFkYXB0ZXIoKSB7DQorCQlpZiAobXVsdGlPdXRwdXRQb3J0SXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQltdWx0aU91dHB1dFBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgTXVsdGlPdXRwdXRQb3J0SXRlbVByb3ZpZGVyKHRoaXMpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIG11bHRpT3V0cHV0UG9ydEl0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmd9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciBzaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmd9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZVBvcnRNYXBwaW5nQWRhcHRlcigpIHsNCisJCWlmIChzaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQorCQkJc2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gc2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXI7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tcmVsLk11bHRpUG9ydE1hcHBpbmd9IGluc3RhbmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyIG11bHRpUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpUG9ydE1hcHBpbmd9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpUG9ydE1hcHBpbmdBZGFwdGVyKCkgew0KKwkJaWYgKG11bHRpUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KKwkJCW11bHRpUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTXVsdGlQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsNCisJCX0NCisNCisJCXJldHVybiBtdWx0aVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nfSBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciBtdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aVNpbmdsZVBvcnRNYXBwaW5nQWRhcHRlcigpIHsNCisJCWlmIChtdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsNCisJCQltdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IE11bHRpU2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7DQorCQl9DQorDQorCQlyZXR1cm4gbXVsdGlTaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsNCisJCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQorCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7DQorCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsNCisJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7DQorCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOw0KKwkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsNCisJCQkJcmV0dXJuIGFkYXB0ZXI7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsNCisJCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsNCisJCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9IGFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorDQorCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgew0KKwkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJaWYgKGNvbXBvc2l0ZVJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyICE9IG51bGwpIGNvbXBvc2l0ZVJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChtb2RlbFJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyICE9IG51bGwpIG1vZGVsUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKGF0b21pY1VuaXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgYXRvbWljVW5pdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoc2VxdWVudGlhbFVuaXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc2VxdWVudGlhbFVuaXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKGNvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyICE9IG51bGwpIGNvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChjb25kaXRpb25hbFVuaXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgY29uZGl0aW9uYWxVbml0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChzaW5nbGVRdWV1ZWRVbml0SXRlbVByb3ZpZGVyICE9IG51bGwpIHNpbmdsZVF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKGNhcnRlc2lhblF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgY2FydGVzaWFuUXVldWVkVW5pdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAocGFyYWxsZWxRdWV1ZWRVbml0SXRlbVByb3ZpZGVyICE9IG51bGwpIHBhcmFsbGVsUXVldWVkVW5pdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoc2luZ2xlRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc2luZ2xlRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKG11bHRpRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbXVsdGlGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoc2luZ2xlRmlsdGVyVW5pdEl0ZW1Qcm92aWRlciAhPSBudWxsKSBzaW5nbGVGaWx0ZXJVbml0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChtdWx0aUZpbHRlclVuaXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbXVsdGlGaWx0ZXJVbml0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChzaW5nbGVGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyICE9IG51bGwpIHNpbmdsZUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKG11bHRpRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlciAhPSBudWxsKSBtdWx0aUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKHNpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlciAhPSBudWxsKSBzaW5nbGVGaWx0ZXJIZWxwZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwkJaWYgKG11bHRpRmlsdGVySGVscGVySXRlbVByb3ZpZGVyICE9IG51bGwpIG11bHRpRmlsdGVySGVscGVySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChzaW5nbGVJbnB1dFBvcnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgc2luZ2xlSW5wdXRQb3J0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChtdWx0aUlucHV0UG9ydEl0ZW1Qcm92aWRlciAhPSBudWxsKSBtdWx0aUlucHV0UG9ydEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAoc2luZ2xlT3V0cHV0UG9ydEl0ZW1Qcm92aWRlciAhPSBudWxsKSBzaW5nbGVPdXRwdXRQb3J0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChtdWx0aU91dHB1dFBvcnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbXVsdGlPdXRwdXRQb3J0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChzaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciAhPSBudWxsKSBzaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQorCQlpZiAobXVsdGlQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciAhPSBudWxsKSBtdWx0aVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCisJCWlmIChtdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyICE9IG51bGwpIG11bHRpU2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0NvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Db25kaXRpb25DaGVja0l0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWE1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Db25kaXRpb25DaGVja0l0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkNvbmRpdGlvbkNoZWNrOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLkNvbmRpdGlvbkNoZWNrfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbmRpdGlvbkNoZWNrSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRTcGVjUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUiLCAiX1VJX05hbWVkRWxlbWVudF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0Rlc2NyaWJlZEVsZW1lbnRfZGVzY3JpcHRpb25fZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliZWRFbGVtZW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaWJlZEVsZW1lbnRfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5ERVNDUklCRURfRUxFTUVOVF9fREVTQ1JJUFRJT04sDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Db25kaXRpb25DaGVja190eXBlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZGl0aW9uQ2hlY2tfdHlwZV9mZWF0dXJlIiwgIl9VSV9Db25kaXRpb25DaGVja190eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTl9DSEVDS19fVFlQRSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTcGVjIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Db25kaXRpb25DaGVja19zcGVjX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZGl0aW9uQ2hlY2tfc3BlY19mZWF0dXJlIiwgIl9VSV9Db25kaXRpb25DaGVja190eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTl9DSEVDS19fU1BFQywNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIENvbmRpdGlvbkNoZWNrLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db25kaXRpb25DaGVjayIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChDb25kaXRpb25DaGVjaylvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX0NvbmRpdGlvbkNoZWNrX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfQ29uZGl0aW9uQ2hlY2tfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25kaXRpb25DaGVjay5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OX0NIRUNLX19OQU1FOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX0RFU0NSSVBUSU9OOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX1RZUEU6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fU1BFQzoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQorCQlyZXR1cm4gQ29tcmVsRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Db25kaXRpb25hbFVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0NvbmRpdGlvbmFsVW5pdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDBjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Db25kaXRpb25hbFVuaXRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDMwOSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLkNvbmRpdGlvbmFsVW5pdH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBDb21wb3NpdGVVbml0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0NvbmRpdGlvbmFsVW5pdF90eXBlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZGl0aW9uYWxVbml0X3R5cGVfZmVhdHVyZSIsICJfVUlfQ29uZGl0aW9uYWxVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fVFlQRSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19JRik7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19IRUxQRVJfVU5JVFMpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fVEhFTik7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19FTFNFKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX0lOUFVUX1BPUlRTKTsNCisJCX0NCisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KKw0KKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIENvbmRpdGlvbmFsVW5pdC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29uZGl0aW9uYWxVbml0IikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKENvbmRpdGlvbmFsVW5pdClvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX0NvbmRpdGlvbmFsVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX0NvbmRpdGlvbmFsVW5pdF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbmRpdGlvbmFsVW5pdC5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fVFlQRToNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0lGOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX1RIRU46DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0VMU0U6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0lOUFVUX1BPUlRTOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fSUYsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25kaXRpb25DaGVjaygpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVGZWF0dXJlVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUZlYXR1cmVVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX0hFTFBFUl9VTklUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUZpbHRlclVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fSEVMUEVSX1VOSVRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4sDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdG9taWNVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4sDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19USEVOLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uZGl0aW9uYWxVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4sDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4sDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4sDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fRUxTRSwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0b21pY1VuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fRUxTRSwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcXVlbnRpYWxVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX0VMU0UsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25kaXRpb25hbFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fRUxTRSwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fRUxTRSwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09ORElUSU9OQUxfVU5JVF9fRUxTRSwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsNCisJCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOw0KKwkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7DQorDQorCQlib29sZWFuIHF1YWxpZnkgPQ0KKwkJCWNoaWxkRmVhdHVyZSA9PSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4gfHwNCisJCQljaGlsZEZlYXR1cmUgPT0gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5DT05ESVRJT05BTF9VTklUX19FTFNFOw0KKw0KKwkJaWYgKHF1YWxpZnkpIHsNCisJCQlyZXR1cm4gZ2V0U3RyaW5nDQorCQkJCSgiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwNCisJCQkJIG5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwgZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOGFlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9GZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkZlYXR1cmVIZWxwZXI7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuRmVhdHVyZUhlbHBlcn0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgSGVscGVySXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkZFQVRVUkVfSEVMUEVSX19JTlBVVF9QT1JUKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkZFQVRVUkVfSEVMUEVSX19TRUNPTkRBUllfSU5QVVRfUE9SVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQorCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKEZlYXR1cmVIZWxwZXIpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9GZWF0dXJlSGVscGVyX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfRmVhdHVyZUhlbHBlcl90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZlYXR1cmVIZWxwZXIuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkZFQVRVUkVfSEVMUEVSX19JTlBVVF9QT1JUOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuRkVBVFVSRV9IRUxQRVJfX0lOUFVUX1BPUlQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuRkVBVFVSRV9IRUxQRVJfX1NFQ09OREFSWV9JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCkpKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9GZWF0dXJlVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjA5ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkZlYXR1cmVVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5GZWF0dXJlVW5pdH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEhlbHBlclVuaXRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChGZWF0dXJlVW5pdClvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX0ZlYXR1cmVVbml0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfRmVhdHVyZVVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0ZpbHRlckhlbHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvRmlsdGVySGVscGVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkMGFiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0ZpbHRlckhlbHBlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5GaWx0ZXJIZWxwZXI7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuRmlsdGVySGVscGVyfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEhlbHBlckl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9IRUxQRVJfX0lOUFVUX1BPUlQpOw0KKwkJfQ0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQorCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKEZpbHRlckhlbHBlcilvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX0ZpbHRlckhlbHBlcl90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX0ZpbHRlckhlbHBlcl90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZpbHRlckhlbHBlci5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9IRUxQRVJfX0lOUFVUX1BPUlQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvRmlsdGVyVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvRmlsdGVyVW5pdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjE3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9GaWx0ZXJVbml0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5GaWx0ZXJVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5GaWx0ZXJVbml0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEZpbHRlclVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBIZWxwZXJVbml0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRmlsdGVyVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChGaWx0ZXJVbml0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfRmlsdGVyVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX0ZpbHRlclVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0hlbHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvSGVscGVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhMzEwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0hlbHBlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkhlbHBlcjsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5IZWxwZXJ9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgSGVscGVySXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEhlbHBlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRIZWxwZXJJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZE5hbWVzcGFjZVVyaVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlIiwgIl9VSV9OYW1lZEVsZW1lbnRfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9EZXNjcmliZWRFbGVtZW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpYmVkRWxlbWVudF9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9EZXNjcmliZWRFbGVtZW50X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkVEX0VMRU1FTlRfX0RFU0NSSVBUSU9OLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVscGVyIElkIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRIZWxwZXJJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfSGVscGVyX2hlbHBlcklkX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGVscGVyX2hlbHBlcklkX2ZlYXR1cmUiLCAiX1VJX0hlbHBlcl90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkhFTFBFUl9fSEVMUEVSX0lELA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZXNwYWNlIFVyaSBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTmFtZXNwYWNlVXJpUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9IZWxwZXJfbmFtZXNwYWNlVXJpX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGVscGVyX25hbWVzcGFjZVVyaV9mZWF0dXJlIiwgIl9VSV9IZWxwZXJfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5IRUxQRVJfX05BTUVTUEFDRV9VUkksDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoSGVscGVyKW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfSGVscGVyX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfSGVscGVyX3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSGVscGVyLmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfX05BTUU6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fREVTQ1JJUFRJT046DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fSEVMUEVSX0lEOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfX05BTUVTUEFDRV9VUkk6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KKwkJcmV0dXJuIENvbXJlbEVkaXRQbHVnaW4uSU5TVEFOQ0U7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvSGVscGVyVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvSGVscGVyVW5pdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2FkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9IZWxwZXJVbml0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMjIgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuSGVscGVyVW5pdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5IZWxwZXJVbml0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEhlbHBlclVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSGVscGVyVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRIZWxwZXJVbml0SWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGROYW1lc3BhY2VVcmlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIsICJfVUlfTmFtZWRFbGVtZW50X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmVkRWxlbWVudF9kZXNjcmlwdGlvbl9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaWJlZEVsZW1lbnRfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpYmVkRWxlbWVudF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhlbHBlciBVbml0IElkIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRIZWxwZXJVbml0SWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0hlbHBlclVuaXRfaGVscGVyVW5pdElkX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGVscGVyVW5pdF9oZWxwZXJVbml0SWRfZmVhdHVyZSIsICJfVUlfSGVscGVyVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkhFTFBFUl9VTklUX19IRUxQRVJfVU5JVF9JRCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWVzcGFjZSBVcmkgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZVVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfSGVscGVyVW5pdF9uYW1lc3BhY2VVcmlfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9IZWxwZXJVbml0X25hbWVzcGFjZVVyaV9mZWF0dXJlIiwgIl9VSV9IZWxwZXJVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuSEVMUEVSX1VOSVRfX05BTUVTUEFDRV9VUkksDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoSGVscGVyVW5pdClvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX0hlbHBlclVuaXRfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9IZWxwZXJVbml0X3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSGVscGVyVW5pdC5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVRfX05BTUU6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9VTklUX19ERVNDUklQVElPTjoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVRfX0hFTFBFUl9VTklUX0lEOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fTkFNRVNQQUNFX1VSSToNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQorCQlyZXR1cm4gQ29tcmVsRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9JbnB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL0lucHV0UG9ydEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTBmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9JbnB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLklucHV0UG9ydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuSW5wdXRQb3J0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIElucHV0UG9ydEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFBvcnRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJbnB1dFBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoSW5wdXRQb3J0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfSW5wdXRQb3J0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfSW5wdXRQb3J0X3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Nb2RlbFJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Nb2RlbFJlZmFjdG9yaW5nSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlNDhkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL01vZGVsUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI5OCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTW9kZWxSZWZhY3RvcmluZzsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE1vZGVsUmVmYWN0b3JpbmdJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTW9kZWxSZWZhY3RvcmluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRSZWZJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZExhYmVsUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkTmFtZXNwYWNlVXJpUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUiLCAiX1VJX05hbWVkRWxlbWVudF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX0Rlc2NyaWJlZEVsZW1lbnRfZGVzY3JpcHRpb25fZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliZWRFbGVtZW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaWJlZEVsZW1lbnRfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5ERVNDUklCRURfRUxFTUVOVF9fREVTQ1JJUFRJT04sDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWYgSWQgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFJlZklkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Nb2RlbFJlZmFjdG9yaW5nX3JlZklkX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTW9kZWxSZWZhY3RvcmluZ19yZWZJZF9mZWF0dXJlIiwgIl9VSV9Nb2RlbFJlZmFjdG9yaW5nX3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTU9ERUxfUkVGQUNUT1JJTkdfX1JFRl9JRCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhYmVsIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRMYWJlbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTW9kZWxSZWZhY3RvcmluZ19sYWJlbF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01vZGVsUmVmYWN0b3JpbmdfbGFiZWxfZmVhdHVyZSIsICJfVUlfTW9kZWxSZWZhY3RvcmluZ190eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1PREVMX1JFRkFDVE9SSU5HX19MQUJFTCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWVzcGFjZSBVcmkgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZVVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTW9kZWxSZWZhY3RvcmluZ19uYW1lc3BhY2VVcmlfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Nb2RlbFJlZmFjdG9yaW5nX25hbWVzcGFjZVVyaV9mZWF0dXJlIiwgIl9VSV9Nb2RlbFJlZmFjdG9yaW5nX3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTU9ERUxfUkVGQUNUT1JJTkdfX05BTUVTUEFDRV9VUkksDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NT0RFTF9SRUZBQ1RPUklOR19fSU5QVVRfUE9SVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQorCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgTW9kZWxSZWZhY3RvcmluZy5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTW9kZWxSZWZhY3RvcmluZyIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChNb2RlbFJlZmFjdG9yaW5nKW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfTW9kZWxSZWZhY3RvcmluZ190eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX01vZGVsUmVmYWN0b3JpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNb2RlbFJlZmFjdG9yaW5nLmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTkFNRToNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX0RFU0NSSVBUSU9OOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fUkVGX0lEOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTEFCRUw6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19OQU1FU1BBQ0VfVVJJOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX0lOUFVUX1BPUlRTOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTU9ERUxfUkVGQUNUT1JJTkdfX0lOUFVUX1BPUlRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCkpKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQorCQlyZXR1cm4gQ29tcmVsRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWM5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpRmVhdHVyZUhlbHBlcn0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JUKTsNCisJCX0NCisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KKw0KKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIE11bHRpRmVhdHVyZUhlbHBlci5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTXVsdGlGZWF0dXJlSGVscGVyIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKE11bHRpRmVhdHVyZUhlbHBlcilvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX011bHRpRmVhdHVyZUhlbHBlcl90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX011bHRpRmVhdHVyZUhlbHBlcl90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE11bHRpRmVhdHVyZUhlbHBlci5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCkpKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZlYXR1cmVVbml0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZlYXR1cmVVbml0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiMGNjNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIyNSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkTXVsdGlGZWF0dXJlSGVscGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTXVsdGkgRmVhdHVyZSBIZWxwZXIgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE11bHRpRmVhdHVyZUhlbHBlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTXVsdGlGZWF0dXJlVW5pdF9tdWx0aUZlYXR1cmVIZWxwZXJfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NdWx0aUZlYXR1cmVVbml0X211bHRpRmVhdHVyZUhlbHBlcl9mZWF0dXJlIiwgIl9VSV9NdWx0aUZlYXR1cmVVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRkVBVFVSRV9VTklUX19NVUxUSV9GRUFUVVJFX0hFTFBFUiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIHRydWUsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpRmVhdHVyZVVuaXRfdHlwZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX011bHRpRmVhdHVyZVVuaXRfdHlwZV9mZWF0dXJlIiwgIl9VSV9NdWx0aUZlYXR1cmVVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRkVBVFVSRV9VTklUX19UWVBFLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUyk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUKTsNCisJCX0NCisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KKw0KKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIE11bHRpRmVhdHVyZVVuaXQuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L011bHRpRmVhdHVyZVVuaXQiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoTXVsdGlGZWF0dXJlVW5pdClvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX011bHRpRmVhdHVyZVVuaXRfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9NdWx0aUZlYXR1cmVVbml0X3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTXVsdGlGZWF0dXJlVW5pdC5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19UWVBFOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aU91dHB1dFBvcnQoKSkpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpRmlsdGVySGVscGVySXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDUyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlcjsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlcn0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVySGVscGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRklMVEVSX0hFTFBFUl9fT1VUUFVUX1BPUlQpOw0KKwkJfQ0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQorCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgTXVsdGlGaWx0ZXJIZWxwZXIuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L011bHRpRmlsdGVySGVscGVyIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKE11bHRpRmlsdGVySGVscGVyKW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfTXVsdGlGaWx0ZXJIZWxwZXJfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9NdWx0aUZpbHRlckhlbHBlcl90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE11bHRpRmlsdGVySGVscGVyLmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCkpKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZpbHRlclVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpRmlsdGVyVW5pdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUZpbHRlclVuaXRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGaWx0ZXJVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpRmlsdGVyVW5pdH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBGaWx0ZXJVbml0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZE11bHRpRmlsdGVySGVscGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTXVsdGkgRmlsdGVyIEhlbHBlciBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkTXVsdGlGaWx0ZXJIZWxwZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpRmlsdGVyVW5pdF9tdWx0aUZpbHRlckhlbHBlcl9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX011bHRpRmlsdGVyVW5pdF9tdWx0aUZpbHRlckhlbHBlcl9mZWF0dXJlIiwgIl9VSV9NdWx0aUZpbHRlclVuaXRfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9GSUxURVJfVU5JVF9fTVVMVElfRklMVEVSX0hFTFBFUiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIHRydWUsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpRmlsdGVyVW5pdF90eXBlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTXVsdGlGaWx0ZXJVbml0X3R5cGVfZmVhdHVyZSIsICJfVUlfTXVsdGlGaWx0ZXJVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRklMVEVSX1VOSVRfX1RZUEUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUKTsNCisJCX0NCisJCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KKwkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KKwkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KKw0KKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIE11bHRpRmlsdGVyVW5pdC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTXVsdGlGaWx0ZXJVbml0IikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKE11bHRpRmlsdGVyVW5pdClvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX011bHRpRmlsdGVyVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX011bHRpRmlsdGVyVW5pdF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE11bHRpRmlsdGVyVW5pdC5jbGFzcykpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVRfX1RZUEU6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9GSUxURVJfVU5JVF9fT1VUUFVUX1BPUlQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aU91dHB1dFBvcnQoKSkpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpSW5wdXRQb3J0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUlucHV0UG9ydEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmE3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aUlucHV0UG9ydEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpSW5wdXRQb3J0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0SXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgTXVsdGlQb3J0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBNdWx0aUlucHV0UG9ydC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTXVsdGlJbnB1dFBvcnQiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoTXVsdGlJbnB1dFBvcnQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9NdWx0aUlucHV0UG9ydF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX011bHRpSW5wdXRQb3J0X3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aU91dHB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpT3V0cHV0UG9ydEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YjliMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aU91dHB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLk11bHRpT3V0cHV0UG9ydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuTXVsdGlPdXRwdXRQb3J0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIE11bHRpT3V0cHV0UG9ydEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIE11bHRpUG9ydEl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpT3V0cHV0UG9ydEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIE11bHRpT3V0cHV0UG9ydC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTXVsdGlPdXRwdXRQb3J0IikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKE11bHRpT3V0cHV0UG9ydClvYmplY3QpLmdldE5hbWUoKTsNCisJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KKwkJCWdldFN0cmluZygiX1VJX011bHRpT3V0cHV0UG9ydF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX011bHRpT3V0cHV0UG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvTXVsdGlQb3J0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aVBvcnRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGEwMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvTXVsdGlQb3J0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpUG9ydH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcnRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBQb3J0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlQb3J0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWx1ZSBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpUG9ydF92YWx1ZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX011bHRpUG9ydF92YWx1ZV9mZWF0dXJlIiwgIl9VSV9NdWx0aVBvcnRfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1JUX19WQUxVRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChNdWx0aVBvcnQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9NdWx0aVBvcnRfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9NdWx0aVBvcnRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNdWx0aVBvcnQuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1BPUlRfX1ZBTFVFOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWVlMDcxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvTXVsdGlQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuTXVsdGlQb3J0TWFwcGluZ30gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZFNvdXJjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZFRhcmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU291cmNlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpUG9ydE1hcHBpbmdfc291cmNlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTXVsdGlQb3J0TWFwcGluZ19zb3VyY2VfZmVhdHVyZSIsICJfVUlfTXVsdGlQb3J0TWFwcGluZ190eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUlRfTUFQUElOR19fU09VUkNFLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX011bHRpUG9ydE1hcHBpbmdfdGFyZ2V0X2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTXVsdGlQb3J0TWFwcGluZ190YXJnZXRfZmVhdHVyZSIsICJfVUlfTXVsdGlQb3J0TWFwcGluZ190eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUlRfTUFQUElOR19fVEFSR0VULA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgTXVsdGlQb3J0TWFwcGluZy5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTXVsdGlQb3J0TWFwcGluZyIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX011bHRpUG9ydE1hcHBpbmdfdHlwZSIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1M2YwNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL011bHRpU2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk11bHRpU2luZ2xlUG9ydE1hcHBpbmd9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvdXJjZSBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nX3NvdXJjZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfc291cmNlX2ZlYXR1cmUiLCAiX1VJX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9TSU5HTEVfUE9SVF9NQVBQSU5HX19TT1VSQ0UsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSB0cnVlLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfTXVsdGlTaW5nbGVQb3J0TWFwcGluZ190YXJnZXRfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nX3RhcmdldF9mZWF0dXJlIiwgIl9VSV9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nX3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VULA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgTXVsdGlTaW5nbGVQb3J0TWFwcGluZy5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTXVsdGlTaW5nbGVQb3J0TWFwcGluZyIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIGdldFN0cmluZygiX1VJX011bHRpU2luZ2xlUG9ydE1hcHBpbmdfdHlwZSIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9PdXRwdXRQb3J0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9PdXRwdXRQb3J0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0Y2NlOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL091dHB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLk91dHB1dFBvcnQ7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLk91dHB1dFBvcnR9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgT3V0cHV0UG9ydEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFBvcnRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPdXRwdXRQb3J0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKE91dHB1dFBvcnQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9PdXRwdXRQb3J0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfT3V0cHV0UG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvUGFyYWxsZWxRdWV1ZWRVbml0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9QYXJhbGxlbFF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjA4ZWVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvUGFyYWxsZWxRdWV1ZWRVbml0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNzMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXR9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0SXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgVHdpY2VkUXVldWVkVW5pdEl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkTGJsU3RyaWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9QYXJhbGxlbFF1ZXVlZFVuaXRfdHlwZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhcmFsbGVsUXVldWVkVW5pdF90eXBlX2ZlYXR1cmUiLCAiX1VJX1BhcmFsbGVsUXVldWVkVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19UWVBFLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExibCBTdHJpY3QgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZExibFN0cmljdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUGFyYWxsZWxRdWV1ZWRVbml0X2xibFN0cmljdF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhcmFsbGVsUXVldWVkVW5pdF9sYmxTdHJpY3RfZmVhdHVyZSIsICJfVUlfUGFyYWxsZWxRdWV1ZWRVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QQVJBTExFTF9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUUyk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QQVJBTExFTF9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUyk7DQorCQl9DQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCisNCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBQYXJhbGxlbFF1ZXVlZFVuaXQuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BhcmFsbGVsUXVldWVkVW5pdCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChQYXJhbGxlbFF1ZXVlZFVuaXQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9QYXJhbGxlbFF1ZXVlZFVuaXRfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9QYXJhbGxlbFF1ZXVlZFVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQYXJhbGxlbFF1ZXVlZFVuaXQuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19UWVBFOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUUzoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUzoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlRTOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUZlYXR1cmVVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVGaWx0ZXJVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUZpbHRlclVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXRvbWljVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25kaXRpb25hbFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2luZ2xlUXVldWVkVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QQVJBTExFTF9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBBUkFMTEVMX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCkpKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Qb3J0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Qb3J0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhOWQwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1BvcnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5Qb3J0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLlBvcnR9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUG9ydEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQb3J0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIsICJfVUlfTmFtZWRFbGVtZW50X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlc2NyaXB0aW9uIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmVkRWxlbWVudF9kZXNjcmlwdGlvbl9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaWJlZEVsZW1lbnRfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpYmVkRWxlbWVudF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1BvcnRfdHlwZV9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRfdHlwZV9mZWF0dXJlIiwgIl9VSV9Qb3J0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUE9SVF9fVFlQRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChQb3J0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfUG9ydF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1BvcnRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3J0LmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QT1JUX19OQU1FOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QT1JUX19ERVNDUklQVElPTjoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fVFlQRToNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQorCQlyZXR1cm4gQ29tcmVsRWRpdFBsdWdpbi5JTlNUQU5DRTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Qb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWM5MmVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuUG9ydE1hcHBpbmd9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ190eXBlIik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsNCisJCXJldHVybiBDb21yZWxFZGl0UGx1Z2luLklOU1RBTkNFOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1F1ZXVlZFVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1F1ZXVlZFVuaXRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjlkMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvUXVldWVkVW5pdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLlF1ZXVlZFVuaXQ7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuUXVldWVkVW5pdH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBRdWV1ZWRVbml0SXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgQ29tcG9zaXRlVW5pdEl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQkJYWRkU3RyaWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdHJpY3QgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFN0cmljdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUXVldWVkVW5pdF9zdHJpY3RfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9RdWV1ZWRVbml0X3N0cmljdF9mZWF0dXJlIiwgIl9VSV9RdWV1ZWRVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUVVFVUVEX1VOSVRfX1NUUklDVCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChRdWV1ZWRVbml0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfUXVldWVkVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1F1ZXVlZFVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChRdWV1ZWRVbml0LmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5RVUVVRURfVU5JVF9fU1RSSUNUOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1JlZmFjdG9yaW5nVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvUmVmYWN0b3JpbmdVbml0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkOTI5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1JlZmFjdG9yaW5nVW5pdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5SZWZhY3RvcmluZ1VuaXR9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdVbml0SXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFJlZmFjdG9yaW5nVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkU2VxRXhlY3V0aW9uT3JkZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF9uYW1lX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIsICJfVUlfTmFtZWRFbGVtZW50X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcSBFeGVjdXRpb24gT3JkZXIgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFNlcUV4ZWN1dGlvbk9yZGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9SZWZhY3RvcmluZ1VuaXRfc2VxRXhlY3V0aW9uT3JkZXJfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZWZhY3RvcmluZ1VuaXRfc2VxRXhlY3V0aW9uT3JkZXJfZmVhdHVyZSIsICJfVUlfUmVmYWN0b3JpbmdVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUkVGQUNUT1JJTkdfVU5JVF9fU0VRX0VYRUNVVElPTl9PUkRFUiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoUmVmYWN0b3JpbmdVbml0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfUmVmYWN0b3JpbmdVbml0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfUmVmYWN0b3JpbmdVbml0X3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVmYWN0b3JpbmdVbml0LmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5SRUZBQ1RPUklOR19VTklUX19OQU1FOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5SRUZBQ1RPUklOR19VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsNCisJCXJldHVybiBDb21yZWxFZGl0UGx1Z2luLklOU1RBTkNFOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NlcXVlbnRpYWxVbml0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TZXF1ZW50aWFsVW5pdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODA1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TZXF1ZW50aWFsVW5pdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjk1IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5TZXF1ZW50aWFsVW5pdH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIENvbXBvc2l0ZVVuaXRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTZXF1ZW50aWFsVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRTdHJpY3RQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkTGJsU3RyaWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdHJpY3QgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFN0cmljdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2VxdWVudGlhbFVuaXRfc3RyaWN0X2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVudGlhbFVuaXRfc3RyaWN0X2ZlYXR1cmUiLCAiX1VJX1NlcXVlbnRpYWxVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOVElBTF9VTklUX19TVFJJQ1QsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TZXF1ZW50aWFsVW5pdF90eXBlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VxdWVudGlhbFVuaXRfdHlwZV9mZWF0dXJlIiwgIl9VSV9TZXF1ZW50aWFsVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fVFlQRSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMYmwgU3RyaWN0IGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRMYmxTdHJpY3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1NlcXVlbnRpYWxVbml0X2xibFN0cmljdF9mZWF0dXJlIiksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcXVlbnRpYWxVbml0X2xibFN0cmljdF9mZWF0dXJlIiwgIl9VSV9TZXF1ZW50aWFsVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fTEJMX1NUUklDVCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOVElBTF9VTklUX19JTlBVVF9QT1JUUyk7DQorCQl9DQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCisNCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTZXF1ZW50aWFsVW5pdC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VxdWVudGlhbFVuaXQiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoU2VxdWVudGlhbFVuaXQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TZXF1ZW50aWFsVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1NlcXVlbnRpYWxVbml0X3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VxdWVudGlhbFVuaXQuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fU1RSSUNUOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX1RZUEU6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVRTOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX0lOUFVUX1BPUlRTOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOVElBTF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVGZWF0dXJlVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TRVFVRU5USUFMX1VOSVRfX0hFTFBFUl9VTklUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpRmVhdHVyZVVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOVElBTF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVGaWx0ZXJVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fSEVMUEVSX1VOSVRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdG9taWNVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TRVFVRU5USUFMX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uZGl0aW9uYWxVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbGxlbFF1ZXVlZFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0VRVUVOVElBTF9VTklUX19JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TRVFVRU5USUFMX1VOSVRfX0lOUFVUX1BPUlRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlJbnB1dFBvcnQoKSkpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc2NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXJ9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZUhlbHBlckl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEZlYXR1cmVIZWxwZXJJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGZWF0dXJlSGVscGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVCk7DQorCQl9DQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCisNCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTaW5nbGVGZWF0dXJlSGVscGVyLmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TaW5nbGVGZWF0dXJlSGVscGVyIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKFNpbmdsZUZlYXR1cmVIZWxwZXIpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVGZWF0dXJlSGVscGVyX3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfU2luZ2xlRmVhdHVyZUhlbHBlcl90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNpbmdsZUZlYXR1cmVIZWxwZXIuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQ6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2luZ2xlT3V0cHV0UG9ydCgpKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZlYXR1cmVVbml0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmZDE3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZlYXR1cmVVbml0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0SXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgRmVhdHVyZVVuaXRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGZWF0dXJlVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRTaW5nbGVGZWF0dXJlSGVscGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2luZ2xlIEZlYXR1cmUgSGVscGVyIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTaW5nbGVGZWF0dXJlSGVscGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TaW5nbGVGZWF0dXJlVW5pdF9zaW5nbGVGZWF0dXJlSGVscGVyX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2luZ2xlRmVhdHVyZVVuaXRfc2luZ2xlRmVhdHVyZUhlbHBlcl9mZWF0dXJlIiwgIl9VSV9TaW5nbGVGZWF0dXJlVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GRUFUVVJFX1VOSVRfX1NJTkdMRV9GRUFUVVJFX0hFTFBFUiwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIHRydWUsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1NpbmdsZUZlYXR1cmVVbml0X3R5cGVfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TaW5nbGVGZWF0dXJlVW5pdF90eXBlX2ZlYXR1cmUiLCAiX1VJX1NpbmdsZUZlYXR1cmVVbml0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fVFlQRSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUyk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVCk7DQorCQl9DQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCisNCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTaW5nbGVGZWF0dXJlVW5pdC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2luZ2xlRmVhdHVyZVVuaXQiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCisJCVN0cmluZyBsYWJlbCA9ICgoU2luZ2xlRmVhdHVyZVVuaXQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVGZWF0dXJlVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1NpbmdsZUZlYXR1cmVVbml0X3R5cGUiKSArICIgIiArIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorDQorCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2luZ2xlRmVhdHVyZVVuaXQuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX1RZUEU6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19TRUNPTkRBUllfSU5QVVRfUE9SVFM6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfRkVBVFVSRV9VTklUX19TRUNPTkRBUllfSU5QVVRfUE9SVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZU91dHB1dFBvcnQoKSkpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlRmlsdGVySGVscGVySXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkMzgwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXI7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlckhlbHBlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCk7DQorCQl9DQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCisNCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTaW5nbGVGaWx0ZXJIZWxwZXIuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NpbmdsZUZpbHRlckhlbHBlciIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChTaW5nbGVGaWx0ZXJIZWxwZXIpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVGaWx0ZXJIZWxwZXJfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVGaWx0ZXJIZWxwZXJfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTaW5nbGVGaWx0ZXJIZWxwZXIuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZU91dHB1dFBvcnQoKSkpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZpbHRlclVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUZpbHRlclVuaXRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBkMDgzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlRmlsdGVyVW5pdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLlNpbmdsZUZpbHRlclVuaXR9IG9iamVjdC4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIEZpbHRlclVuaXRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQorCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KKw0KKwkJCWFkZFNpbmdsZUZpbHRlckhlbHBlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNpbmdsZSBGaWx0ZXIgSGVscGVyIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRTaW5nbGVGaWx0ZXJIZWxwZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1NpbmdsZUZpbHRlclVuaXRfc2luZ2xlRmlsdGVySGVscGVyX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2luZ2xlRmlsdGVyVW5pdF9zaW5nbGVGaWx0ZXJIZWxwZXJfZmVhdHVyZSIsICJfVUlfU2luZ2xlRmlsdGVyVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GSUxURVJfVU5JVF9fU0lOR0xFX0ZJTFRFUl9IRUxQRVIsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSB0cnVlLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TaW5nbGVGaWx0ZXJVbml0X3R5cGVfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TaW5nbGVGaWx0ZXJVbml0X3R5cGVfZmVhdHVyZSIsICJfVUlfU2luZ2xlRmlsdGVyVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GSUxURVJfVU5JVF9fVFlQRSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCisJCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQpOw0KKwkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVCk7DQorCQl9DQorCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCisJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCisJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCisNCisJCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTaW5nbGVGaWx0ZXJVbml0LmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TaW5nbGVGaWx0ZXJVbml0IikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKFNpbmdsZUZpbHRlclVuaXQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVGaWx0ZXJVbml0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfU2luZ2xlRmlsdGVyVW5pdF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNpbmdsZUZpbHRlclVuaXQuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fVFlQRToNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GSUxURVJfVU5JVF9fT1VUUFVUX1BPUlQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCkpKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TaW5nbGVJbnB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZUlucHV0UG9ydEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjA2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TaW5nbGVJbnB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2luZ2xlSW5wdXRQb3J0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEl0ZW1Qcm92aWRlcg0KKwlleHRlbmRzIFNpbmdsZVBvcnRJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTaW5nbGVJbnB1dFBvcnQuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NpbmdsZUlucHV0UG9ydCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChTaW5nbGVJbnB1dFBvcnQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVJbnB1dFBvcnRfdHlwZSIpIDoNCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVJbnB1dFBvcnRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZU91dHB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZU91dHB1dFBvcnRJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzM4MDNiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlT3V0cHV0UG9ydEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByb3ZpZGVyOw0KKw0KKw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydH0gb2JqZWN0Lg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVPdXRwdXRQb3J0SXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgU2luZ2xlUG9ydEl0ZW1Qcm92aWRlcg0KKwlpbXBsZW1lbnRzDQorCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwNCisJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwNCisJCUlJdGVtTGFiZWxQcm92aWRlciwNCisJCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KKwkvKioNCisJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCisJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQorDQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyBTaW5nbGVPdXRwdXRQb3J0LmdpZi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCisJCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TaW5nbGVPdXRwdXRQb3J0IikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKFNpbmdsZU91dHB1dFBvcnQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVPdXRwdXRQb3J0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT3V0cHV0UG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlUG9ydEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlUG9ydEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTMxODIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TaW5nbGVQb3J0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUG9ydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5TaW5nbGVQb3J0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVBvcnRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBQb3J0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUG9ydEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRWYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFsdWUgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TaW5nbGVQb3J0X3ZhbHVlX2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2luZ2xlUG9ydF92YWx1ZV9mZWF0dXJlIiwgIl9VSV9TaW5nbGVQb3J0X3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX1BPUlRfX1ZBTFVFLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlTdHJpbmcgbGFiZWwgPSAoKFNpbmdsZVBvcnQpb2JqZWN0KS5nZXROYW1lKCk7DQorCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCisJCQlnZXRTdHJpbmcoIl9VSV9TaW5nbGVQb3J0X3R5cGUiKSA6DQorCQkJZ2V0U3RyaW5nKCJfVUlfU2luZ2xlUG9ydF90eXBlIikgKyAiICIgKyBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KKwkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQorCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KKw0KKwkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNpbmdsZVBvcnQuY2xhc3MpKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX19WQUxVRToNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE3MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvU2luZ2xlUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tcmVsLlNpbmdsZVBvcnRNYXBwaW5nfSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyDQorCWV4dGVuZHMgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXINCisJaW1wbGVtZW50cw0KKwkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsDQorCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsDQorCQlJSXRlbUxhYmVsUHJvdmlkZXIsDQorCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCisJLyoqDQorCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCQlhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvdXJjZSBmZWF0dXJlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgYWRkU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TaW5nbGVQb3J0TWFwcGluZ19zb3VyY2VfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TaW5nbGVQb3J0TWFwcGluZ19zb3VyY2VfZmVhdHVyZSIsICJfVUlfU2luZ2xlUG9ydE1hcHBpbmdfdHlwZSIpLA0KKwkJCQkgQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUE9SVF9NQVBQSU5HX19TT1VSQ0UsDQorCQkJCSB0cnVlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSB0cnVlLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgZmVhdHVyZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQorCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KKwkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCisJCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfU2luZ2xlUG9ydE1hcHBpbmdfdGFyZ2V0X2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2luZ2xlUG9ydE1hcHBpbmdfdGFyZ2V0X2ZlYXR1cmUiLCAiX1VJX1NpbmdsZVBvcnRNYXBwaW5nX3R5cGUiKSwNCisJCQkJIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VULA0KKwkJCQkgdHJ1ZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgdHJ1ZSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsLA0KKwkJCQkgbnVsbCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgU2luZ2xlUG9ydE1hcHBpbmcuZ2lmLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KKwkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1NpbmdsZVBvcnRNYXBwaW5nIikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfU2luZ2xlUG9ydE1hcHBpbmdfdHlwZSIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQorCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQorCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCisJICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KKwkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TaW5nbGVRdWV1ZWRVbml0SXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9TaW5nbGVRdWV1ZWRVbml0SXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhZTlkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdC9zcmMvY29tcmVsL3Byb3ZpZGVyL1NpbmdsZVF1ZXVlZFVuaXRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5wcm92aWRlcjsNCisNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUXVldWVkVW5pdDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBRdWV1ZWRVbml0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQkJYWRkTGJsU3RyaWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQorCQl9DQorCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCisJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQorCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KKwkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQorCQkJCSBnZXRTdHJpbmcoIl9VSV9TaW5nbGVRdWV1ZWRVbml0X3R5cGVfZmVhdHVyZSIpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TaW5nbGVRdWV1ZWRVbml0X3R5cGVfZmVhdHVyZSIsICJfVUlfU2luZ2xlUXVldWVkVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9RVUVVRURfVU5JVF9fVFlQRSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgZmFsc2UsDQorCQkJCSBmYWxzZSwNCisJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCisJCQkJIG51bGwsDQorCQkJCSBudWxsKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMYmwgU3RyaWN0IGZlYXR1cmUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBhZGRMYmxTdHJpY3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KKwkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCisJCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQorCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1NpbmdsZVF1ZXVlZFVuaXRfbGJsU3RyaWN0X2ZlYXR1cmUiKSwNCisJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2luZ2xlUXVldWVkVW5pdF9sYmxTdHJpY3RfZmVhdHVyZSIsICJfVUlfU2luZ2xlUXVldWVkVW5pdF90eXBlIiksDQorCQkJCSBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9RVUVVRURfVU5JVF9fTEJMX1NUUklDVCwNCisJCQkJIHRydWUsDQorCQkJCSBmYWxzZSwNCisJCQkJIGZhbHNlLA0KKwkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KKwkJCQkgbnVsbCwNCisJCQkJIG51bGwpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCQljaGlsZHJlbkZlYXR1cmVzLmFkZChDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUyk7DQorCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlQpOw0KKwkJfQ0KKwkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQorCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQorCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQorDQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgU2luZ2xlUXVldWVkVW5pdC5naWYuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2luZ2xlUXVldWVkVW5pdCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChTaW5nbGVRdWV1ZWRVbml0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfU2luZ2xlUXVldWVkVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1NpbmdsZVF1ZXVlZFVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisNCisJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTaW5nbGVRdWV1ZWRVbml0LmNsYXNzKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX1RZUEU6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTOg0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlQ6DQorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQorCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCisJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTLA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlGZWF0dXJlVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUZpbHRlclVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUZpbHRlclVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXRvbWljVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXF1ZW50aWFsVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25kaXRpb25hbFVuaXQoKSkpOw0KKw0KKwkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCisJCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCisJCQkJKENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULA0KKwkJCQkgQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2luZ2xlUXVldWVkVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkpKTsNCisNCisJCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQorCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQorCQkJCShDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCwNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUywNCisJCQkJIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpKSk7DQorDQorCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KKwkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KKwkJCQkoQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlQsDQorCQkJCSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvVHdpY2VkUXVldWVkVW5pdEl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0L3NyYy9jb21yZWwvcHJvdmlkZXIvVHdpY2VkUXVldWVkVW5pdEl0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2M4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQvc3JjL2NvbXJlbC9wcm92aWRlci9Ud2ljZWRRdWV1ZWRVbml0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJvdmlkZXI7DQorDQorDQoraW1wb3J0IGNvbXJlbC5Ud2ljZWRRdWV1ZWRVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbXJlbC5Ud2ljZWRRdWV1ZWRVbml0fSBvYmplY3QuDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFR3aWNlZFF1ZXVlZFVuaXRJdGVtUHJvdmlkZXINCisJZXh0ZW5kcyBRdWV1ZWRVbml0SXRlbVByb3ZpZGVyDQorCWltcGxlbWVudHMNCisJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLA0KKwkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLA0KKwkJSUl0ZW1MYWJlbFByb3ZpZGVyLA0KKwkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQorCS8qKg0KKwkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVHdpY2VkUXVldWVkVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KKwkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQorCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KKwkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCisNCisJCX0NCisJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KKwkJU3RyaW5nIGxhYmVsID0gKChUd2ljZWRRdWV1ZWRVbml0KW9iamVjdCkuZ2V0TmFtZSgpOw0KKwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQorCQkJZ2V0U3RyaW5nKCJfVUlfVHdpY2VkUXVldWVkVW5pdF90eXBlIikgOg0KKwkJCWdldFN0cmluZygiX1VJX1R3aWNlZFF1ZXVlZFVuaXRfdHlwZSIpICsgIiAiICsgbGFiZWw7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCisJICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KKwkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCisJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KKwkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQorCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmJjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS42Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzc4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yPC9uYW1lPg0KKwk8Y29tbWVudD48L2NvbW1lbnQ+DQorCTxwcm9qZWN0cz4NCisJPC9wcm9qZWN0cz4NCisJPGJ1aWxkU3BlYz4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwk8L2J1aWxkU3BlYz4NCisJPG5hdHVyZXM+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzVmYzUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxNyBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1OYW1lOiBDb01SZUwgRWRpdG9yDQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3I7c2luZ2xldG9uOj10cnVlDQorQnVuZGxlLVZlcnNpb246IDAuOS4wDQorQnVuZGxlLUNsYXNzUGF0aDogLg0KK0J1bmRsZS1BY3RpdmF0b3I6IGNvbXJlbC5wcmVzZW50YXRpb24uQ29tcmVsRWRpdG9yUGx1Z2luJEltcGxlbWVudGF0aW9uDQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjYNCitFeHBvcnQtUGFja2FnZTogY29tcmVsLnByZXNlbnRhdGlvbg0KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsDQorIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS51aS5pZGU7dmlzaWJpbGl0eTo9cmVleHBvcnQNCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL2Jpbi8uZ2l0aWdub3JlIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvYmluLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4ZGJjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL2Jpbi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKy9jb21yZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDIwODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYgQEAKKw0KKyMgPGNvcHlyaWdodD4NCisjIDwvY29weXJpZ2h0Pg0KKyMNCisjICRJZCQNCisNCitiaW4uaW5jbHVkZXMgPSAuLFwNCisgICAgICAgICAgICAgICBpY29ucy8sXA0KKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KKyAgICAgICAgICAgICAgIHNyYy8sXA0KKyAgICAgICAgICAgICAgIGJpbi8NCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuDQorc291cmNlLi4gPSBzcmMvDQorb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvaWNvbnMvZnVsbC9vYmoxNi9Db21yZWxNb2RlbEZpbGUuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvaWNvbnMvZnVsbC9vYmoxNi9Db21yZWxNb2RlbEZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2RiNmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9pY29ucy9mdWxsL29iajE2L0NvbXJlbE1vZGVsRmlsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvaWNvbnMvZnVsbC93aXpiYW4vTmV3Q29tcmVsLmdpZiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL2ljb25zL2Z1bGwvd2l6YmFuL05ld0NvbXJlbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhNGQzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL2ljb25zL2Z1bGwvd2l6YmFuL05ld0NvbXJlbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWExNjQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1NyBAQAorDQorIyA8Y29weXJpZ2h0Pg0KKyMgPC9jb3B5cmlnaHQ+DQorIw0KKyMgJElkJA0KKw0KK3BsdWdpbk5hbWUgPSBDb21yZWwgRWRpdG9yDQorcHJvdmlkZXJOYW1lID0gd3d3LmV4YW1wbGUub3JnDQorDQorX1VJX0NvbXJlbEVkaXRvcl9tZW51ID0gJkNvbXJlbCBFZGl0b3INCisNCitfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtID0gJk5ldyBDaGlsZA0KK19VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSA9IE4mZXcgU2libGluZw0KKw0KK19VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtID0gU2hvdyAmUHJvcGVydGllcyBWaWV3DQorX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtID0gJlJlZnJlc2gNCisNCitfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCA9IFNlbGVjdGlvbg0KK19VSV9QYXJlbnRQYWdlX2xhYmVsID0gUGFyZW50DQorX1VJX0xpc3RQYWdlX2xhYmVsID0gTGlzdA0KK19VSV9UcmVlUGFnZV9sYWJlbCA9IFRyZWUNCitfVUlfVGFibGVQYWdlX2xhYmVsID0gVGFibGUNCitfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCA9IFRyZWUgd2l0aCBDb2x1bW5zDQorX1VJX09iamVjdENvbHVtbl9sYWJlbCA9IE9iamVjdA0KK19VSV9TZWxmQ29sdW1uX2xhYmVsID0gU2VsZg0KKw0KK19VSV9Ob09iamVjdFNlbGVjdGVkID0gU2VsZWN0ZWQgTm90aGluZw0KK19VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCA9IFNlbGVjdGVkIE9iamVjdDogezB9DQorX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQgPSBTZWxlY3RlZCB7MH0gT2JqZWN0cw0KKw0KK19VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWwgPSBPcGVuIEVkaXRvcg0KKw0KK19VSV9XaXphcmRfY2F0ZWdvcnkgPSBFeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzDQorDQorX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSA9IFByb2JsZW1zIGVuY291bnRlcmVkIGluIGZpbGUgInswfSINCisNCitfVUlfQ29tcmVsTW9kZWxXaXphcmRfbGFiZWwgPSBDb21yZWwgTW9kZWwNCitfVUlfQ29tcmVsTW9kZWxXaXphcmRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgQ29tcmVsIG1vZGVsDQorDQorX1VJX0NvbXJlbEVkaXRvcl9sYWJlbCA9IENvbXJlbCBNb2RlbCBFZGl0b3INCisNCitfVUlfQ29tcmVsRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZSA9IE15DQorX1VJX0NvbXJlbEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9ucyA9IGNvbXJlbA0KKw0KK19VSV9XaXphcmRfbGFiZWwgPSBOZXcNCisNCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbiA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gJycuezB9JycNCitfV0FSTl9GaWxlbmFtZUV4dGVuc2lvbnMgPSBUaGUgZmlsZSBuYW1lIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOiB7MH0NCisNCitfVUlfTW9kZWxPYmplY3QgPSAmTW9kZWwgT2JqZWN0DQorX1VJX1hNTEVuY29kaW5nID0gJlhNTCBFbmNvZGluZw0KK19VSV9YTUxFbmNvZGluZ0Nob2ljZXMgPSBVVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQ0KK19VSV9XaXphcmRfaW5pdGlhbF9vYmplY3RfZGVzY3JpcHRpb24gPSBTZWxlY3QgYSBtb2RlbCBvYmplY3QgdG8gY3JlYXRlDQorDQorX1VJX0ZpbGVDb25mbGljdF9sYWJlbCA9IEZpbGUgQ29uZmxpY3QNCitfV0FSTl9GaWxlQ29uZmxpY3QgPSBUaGVyZSBhcmUgdW5zYXZlZCBjaGFuZ2VzIHRoYXQgY29uZmxpY3Qgd2l0aCBjaGFuZ2VzIG1hZGUgb3V0c2lkZSB0aGUgZWRpdG9yLiAgRG8geW91IHdpc2ggdG8gZGlzY2FyZCB0aGlzIGVkaXRvcidzIGNoYW5nZXM/DQorDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3IvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYTUwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL3BsdWdpbi54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQorDQorPCEtLQ0KKyA8Y29weXJpZ2h0Pg0KKyA8L2NvcHlyaWdodD4NCisNCisgJElkJA0KKy0tPg0KKw0KKzxwbHVnaW4+DQorDQorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+DQorICAgICAgPGNhdGVnb3J5DQorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiDQorICAgICAgICAgICAgbmFtZT0iJV9VSV9XaXphcmRfY2F0ZWdvcnkiLz4NCisgICAgICA8d2l6YXJkDQorICAgICAgICAgICAgaWQ9ImNvbXJlbC5wcmVzZW50YXRpb24uQ29tcmVsTW9kZWxXaXphcmRJRCINCisgICAgICAgICAgICBuYW1lPSJDb01SZUwgbW9kZWwiDQorICAgICAgICAgICAgY2xhc3M9ImNvbXJlbC5wcmVzZW50YXRpb24uQ29tcmVsTW9kZWxXaXphcmQiDQorICAgICAgICAgICAgY2F0ZWdvcnk9ImNvbXJlbC5nZW5lcmF0b3IuY2F0ZWdvcnkiDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9Db21yZWxNb2RlbEZpbGUuZ2lmIj4NCisgICAgICAgICA8ZGVzY3JpcHRpb24+JV9VSV9Db21yZWxNb2RlbFdpemFyZF9kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+DQorICAgICAgICAgPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+DQorICAgICAgPC93aXphcmQ+DQorICAgPC9leHRlbnNpb24+DQorDQorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+DQorICAgICAgPGVkaXRvcg0KKyAgICAgICAgICAgIGlkPSJjb21yZWwucHJlc2VudGF0aW9uLkNvbXJlbEVkaXRvcklEIg0KKyAgICAgICAgICAgIG5hbWU9IiVfVUlfQ29tcmVsRWRpdG9yX2xhYmVsIg0KKyAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvQ29tcmVsTW9kZWxGaWxlLmdpZiINCisgICAgICAgICAgICBleHRlbnNpb25zPSJjb21yZWwiDQorICAgICAgICAgICAgY2xhc3M9ImNvbXJlbC5wcmVzZW50YXRpb24uQ29tcmVsRWRpdG9yIg0KKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9ImNvbXJlbC5wcmVzZW50YXRpb24uQ29tcmVsQWN0aW9uQmFyQ29udHJpYnV0b3IiPg0KKyAgICAgIDwvZWRpdG9yPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKw0KKzwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL3NyYy9jb21yZWwvcHJlc2VudGF0aW9uL0NvbXJlbEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9zcmMvY29tcmVsL3ByZXNlbnRhdGlvbi9Db21yZWxBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGNmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9zcmMvY29tcmVsL3ByZXNlbnRhdGlvbi9Db21yZWxBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsNDI3IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByZXNlbnRhdGlvbjsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29udHJvbEFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkxvYWRSZXNvdXJjZUFjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvciB0aGUgQ29tcmVsIG1vZGVsIGVkaXRvci4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsQWN0aW9uQmFyQ29udHJpYnV0b3INCisJZXh0ZW5kcyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3INCisJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yUGFydDsNCisNCisJLyoqDQorCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgYWN0aW9uIG9wZW5zIHRoZSBQcm9wZXJ0aWVzIHZpZXcuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPQ0KKwkJbmV3IEFjdGlvbihDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbSIpKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQl0cnkgew0KKwkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7DQorCQkJCX0NCisJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yDQorCSAqIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0NCisJCW5ldyBBY3Rpb24oQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7DQorCQkJCXJldHVybiBhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOw0KKwkJCX0NCisNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCWlmIChhY3RpdmVFZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7DQorCQkJCQlWaWV3ZXIgdmlld2VyID0gKChJVmlld2VyUHJvdmlkZXIpYWN0aXZlRWRpdG9yUGFydCkuZ2V0Vmlld2VyKCk7DQorCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsNCisJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZGVzY3JpcHRvcg0KKwkgKiBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IGNyZWF0ZUNoaWxkQWN0aW9uczsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBkZXNjcmlwdG9yDQorCSAqIGdlbmVyYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGJ5IHRoZSBpdGVtIHByb3ZpZGVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gY3JlYXRlU2libGluZ0FjdGlvbnM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUgYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBDb21yZWxBY3Rpb25CYXJDb250cmlidXRvcigpIHsNCisJCXN1cGVyKEFERElUSU9OU19MQVNUX1NUWUxFKTsNCisJCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsNCisJCXZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlQWN0aW9uKCk7DQorCQljb250cm9sQWN0aW9uID0gbmV3IENvbnRyb2xBY3Rpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7DQorCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiY29tcmVsLXNldHRpbmdzIikpOw0KKwkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImNvbXJlbC1hZGRpdGlvbnMiKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWRkcyB0byB0aGUgbWVudSBiYXIgYSBtZW51IGFuZCBzb21lIHNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMsDQorCSAqIGFzIHdlbGwgYXMgdGhlIHN1Yi1tZW51cyBmb3Igb2JqZWN0IGNyZWF0aW9uIGl0ZW1zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsNCisNCisJCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29tcmVsRWRpdG9yX21lbnUiKSwgImNvbXJlbE1lbnVJRCIpOw0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOw0KKwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOw0KKw0KKwkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlQ2hpbGQgaXRlbSBhZGRpdGlvbiBvciByZW1vdmFsLg0KKwkJLy8NCisJCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsNCisJCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcik7DQorDQorCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4NCisJCS8vDQorCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOw0KKwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOw0KKw0KKwkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuDQorCQkvLw0KKwkJc3VibWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyDQorCQkJKG5ldyBJTWVudUxpc3RlbmVyKCkgew0KKwkJCQkgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgew0KKwkJCQkJIG1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsNCisJCQkJIH0NCisJCQkgfSk7DQorDQorCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsNCisJfQ0KKw0KKwkvKioNCisJICogV2hlbiB0aGUgYWN0aXZlIGVkaXRvciBjaGFuZ2VzLCB0aGlzIHJlbWVtYmVycyB0aGUgY2hhbmdlIGFuZCByZWdpc3RlcnMgd2l0aCBpdCBhcyBhIHNlbGVjdGlvbiBwcm92aWRlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgew0KKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOw0KKwkJYWN0aXZlRWRpdG9yUGFydCA9IHBhcnQ7DQorDQorCQkvLyBTd2l0Y2ggdG8gdGhlIG5ldyBzZWxlY3Rpb24gcHJvdmlkZXIuDQorCQkvLw0KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsNCisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorCQl9DQorCQlpZiAocGFydCA9PSBudWxsKSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOw0KKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsNCisNCisJCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4NCisJCQkvLw0KKwkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7DQorCQkJCXNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyfSwNCisJICogaGFuZGxpbmcge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fXMgYnkgcXVlcnlpbmcgZm9yIHRoZSBjaGlsZHJlbiBhbmQgc2libGluZ3MNCisJICogdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIG9iamVjdCBhbmQgdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCisJCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4NCisJCS8vDQorCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsNCisJCX0NCisJCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgew0KKwkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOw0KKwkJfQ0KKw0KKwkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzDQorCQkvLw0KKwkJQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsNCisJCUNvbGxlY3Rpb248Pz4gbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gbnVsbDsNCisNCisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7DQorCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnNpemUoKSA9PSAxKSB7DQorCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsNCisNCisJCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcilhY3RpdmVFZGl0b3JQYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7DQorDQorCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7DQorCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzID0gZG9tYWluLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobnVsbCwgb2JqZWN0KTsNCisJCX0NCisNCisJCS8vIEdlbmVyYXRlIGFjdGlvbnMgZm9yIHNlbGVjdGlvbjsgcG9wdWxhdGUgYW5kIHJlZHJhdyB0aGUgbWVudXMuDQorCQkvLw0KKwkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsNCisJCWNyZWF0ZVNpYmxpbmdBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhuZXdTaWJsaW5nRGVzY3JpcHRvcnMsIHNlbGVjdGlvbik7DQorDQorCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7DQorCQkJcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucywgbnVsbCk7DQorCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7DQorCQl9DQorCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7DQorCQkJY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9ufSBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LA0KKwkgKiBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbGxlY3Rpb248SUFjdGlvbj4gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbjw/PiBkZXNjcmlwdG9ycywgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCUNvbGxlY3Rpb248SUFjdGlvbj4gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8SUFjdGlvbj4oKTsNCisJCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7DQorCQkJZm9yIChPYmplY3QgZGVzY3JpcHRvciA6IGRlc2NyaXB0b3JzKSB7DQorCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gYWN0aW9uczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBnZW5lcmF0ZXMgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGZvciBlYWNoIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sDQorCSAqIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb248Pz4gZGVzY3JpcHRvcnMsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlDb2xsZWN0aW9uPElBY3Rpb24+IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElBY3Rpb24+KCk7DQorCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KKwkJCWZvciAoT2JqZWN0IGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgew0KKwkJCQlhY3Rpb25zLmFkZChuZXcgQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVFZGl0b3JQYXJ0LCBzZWxlY3Rpb24sIGRlc2NyaXB0b3IpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gYWN0aW9uczsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zDQorCSAqIGJhc2VkIG9uIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGNvbGxlY3Rpb24sDQorCSAqIGJ5IGluc2VydGluZyB0aGVtIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4NCisJICogSWYgPGNvZGU+Y29udHJpYnV0aW9uSUQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7DQorCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7DQorCQkJZm9yIChJQWN0aW9uIGFjdGlvbiA6IGFjdGlvbnMpIHsNCisJCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsNCisJCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKwkJDQorCS8qKg0KKwkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cw0KKwkgKiBiYXNlZCBvbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9ufXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgZGVwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUFjdGlvbj4gYWN0aW9ucykgew0KKwkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgew0KKwkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgew0KKwkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMNCisJCQkJLy8NCisJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOw0KKwkJCQl3aGlsZSAoY29udHJpYnV0aW9uSXRlbSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIHsNCisJCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pY29udHJpYnV0aW9uSXRlbSkuZ2V0SW5uZXJJdGVtKCk7DQorCQkJCX0NCisNCisJCQkJLy8gRGVsZXRlIHRoZSBBY3Rpb25Db250cmlidXRpb25JdGVtcyB3aXRoIG1hdGNoaW5nIGFjdGlvbi4NCisJCQkJLy8NCisJCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7DQorCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSljb250cmlidXRpb25JdGVtKS5nZXRBY3Rpb24oKTsNCisJCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsNCisJCQkJCQltYW5hZ2VyLnJlbW92ZShjb250cmlidXRpb25JdGVtKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7DQorCQlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG51bGw7DQorDQorCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOw0KKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOw0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJlZGl0Iiwgc3VibWVudU1hbmFnZXIpOw0KKw0KKwkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOw0KKwkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywgbnVsbCk7DQorCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImVkaXQiLCBzdWJtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW5zZXJ0cyBnbG9iYWwgYWN0aW9ucyBiZWZvcmUgdGhlICJhZGRpdGlvbnMtZW5kIiBzZXBhcmF0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgYWRkR2xvYmFsQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsNCisJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsNCisNCisJCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsJCQ0KKwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsNCisNCisJCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGRlbGV0ZSBhY3Rpb24gd2lsbCBjbGVhbiB1cCBhbGwgcmVmZXJlbmNlcyB0byBkZWxldGVkIG9iamVjdHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlQWxsUmVmZXJlbmNlc09uRGVsZXRlKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3Ivc3JjL2NvbXJlbC9wcmVzZW50YXRpb24vQ29tcmVsRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9zcmMvY29tcmVsL3ByZXNlbnRhdGlvbi9Db21yZWxFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzcyNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3Ivc3JjL2NvbXJlbC9wcmVzZW50YXRpb24vQ29tcmVsRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxODE2IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByZXNlbnRhdGlvbjsNCisNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldFBhZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5NYXJrZXJIZWxwZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVmlld2VyUGFuZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5lZGl0b3IuUHJvYmxlbUVkaXRvclBhcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVZhbGlkYXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5SXRlbURlbGVnYXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5jZWxsZWRpdG9yLkFkYXB0ZXJGYWN0b3J5VHJlZUVkaXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuVW53cmFwcGluZ1NlbGVjdGlvblByb3ZpZGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS52aWV3LkV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2U7DQorDQoraW1wb3J0IGNvbXJlbC5wcm92aWRlci5Db21yZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247DQorDQorDQorLyoqDQorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgQ29tcmVsIG1vZGVsIGVkaXRvci4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsRWRpdG9yDQorCWV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydA0KKwlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwgSU1lbnVMaXN0ZW5lciwgSVZpZXdlclByb3ZpZGVyLCBJR290b01hcmtlciB7DQorCS8qKg0KKwkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlcjsNCisNCisJLyoqDQorCSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgb3V0bGluZSBwYWdlJ3Mgdmlld2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgdmlld2VyIHRoYXQgc2hhZG93cyB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb250ZW50IG91dGxpbmUuDQorCSAqIFRoZSBwYXJlbnQgcmVsYXRpb24gbXVzdCBiZSBjb3JyZWN0bHkgZGVmaW5lZCBmb3IgdGhpcyB0byB3b3JrLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgc2VsZWN0aW9uVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBpbnZlcnRzIHRoZSByb2xsIG9mIHBhcmVudCBhbmQgY2hpbGQgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYW5kIHNob3cgcGFyZW50cyBhcyBhIHRyZWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVHJlZVZpZXdlciBwYXJlbnRWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIHRyZWUgdmlldyB3b3Jrcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIHNob3dzIGhvdyBhIGxpc3QgdmlldyB3b3Jrcy4NCisJICogQSBsaXN0IHZpZXdlciBkb2Vzbid0IHN1cHBvcnQgaWNvbnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTGlzdFZpZXdlciBsaXN0Vmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSB0YWJsZSB2aWV3IHdvcmtzLg0KKwkgKiBBIHRhYmxlIGNhbiBiZSB1c2VkIGFzIGEgbGlzdCB3aXRoIGljb25zLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOw0KKw0KKwkvKioNCisJICogVGhpcyBzaG93cyBob3cgYSB0cmVlIHZpZXcgd2l0aCBjb2x1bW5zIHdvcmtzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcldpdGhDb2x1bW5zOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIHZpZXdlciBwYW5lLCBpbiB0aGUgYm9vay4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBWaWV3ZXJQYW5lIGN1cnJlbnRWaWV3ZXJQYW5lOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgYWN0aXZlIGNvbnRlbnQgdmlld2VyLCB3aGljaCBtYXkgYmUgZWl0aGVyIG9uZSBvZiB0aGUgdmlld2VycyBpbiB0aGUgcGFnZXMgb3IgdGhlIGNvbnRlbnQgb3V0bGluZSB2aWV3ZXIuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVmlld2VyIGN1cnJlbnRWaWV3ZXI7DQorDQorCS8qKg0KKwkgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9cyB0aGF0IGFyZSBsaXN0ZW5pbmcgdG8gdGhpcyBlZGl0b3IuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOw0KKw0KKwkvKioNCisJICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBlZGl0b3IgYXMgYSB3aG9sZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7DQorDQorCS8qKg0KKwkgKiBUaGUgTWFya2VySGVscGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2UgbWFya2VycyBwcmVzZW50ZWQNCisJICogaW4gRWNsaXBzZSdzIFByb2JsZW1zIFZpZXcuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTWFya2VySGVscGVyIG1hcmtlckhlbHBlciA9IG5ldyBFZGl0VUlNYXJrZXJIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZQ0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0NCisJCW5ldyBJUGFydExpc3RlbmVyKCkgew0KKwkJCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQlpZiAocCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSB7DQorCQkJCQlpZiAoKChDb250ZW50T3V0bGluZSlwKS5nZXRDdXJyZW50UGFnZSgpID09IGNvbnRlbnRPdXRsaW5lUGFnZSkgew0KKwkJCQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKENvbXJlbEVkaXRvci50aGlzKTsNCisNCisJCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIGlmIChwIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgew0KKwkJCQkJaWYgKCgoUHJvcGVydHlTaGVldClwKS5nZXRDdXJyZW50UGFnZSgpID09IHByb3BlcnR5U2hlZXRQYWdlKSB7DQorCQkJCQkJZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoQ29tcmVsRWRpdG9yLnRoaXMpOw0KKwkJCQkJCWhhbmRsZUFjdGl2YXRlKCk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZSBpZiAocCA9PSBDb21yZWxFZGl0b3IudGhpcykgew0KKwkJCQkJaGFuZGxlQWN0aXZhdGUoKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsNCisJCQkJLy8gSWdub3JlLg0KKwkJCX0NCisJCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgew0KKwkJCQkvLyBJZ25vcmUuDQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJLyoqDQorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisNCisJLyoqDQorCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCS8qKg0KKwkgKiBNYXAgdG8gc3RvcmUgdGhlIGRpYWdub3N0aWMgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFJlc291cmNlLCBEaWFnbm9zdGljPigpOw0KKw0KKwkvKioNCisJICogQ29udHJvbHMgd2hldGhlciB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHNob3VsZCBiZSB1cGRhdGVkLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSB0cnVlOw0KKw0KKwkvKioNCisJICogQWRhcHRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgcHJvYmxlbSBpbmRpY2F0aW9uIHdoZW4gcmVzb3VyY2VzIGFyZSBkZW1hbmRlZCBsb2FkZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUNvbnRlbnRBZGFwdGVyIHByb2JsZW1JbmRpY2F0aW9uQWRhcHRlciA9IA0KKwkJbmV3IEVDb250ZW50QWRhcHRlcigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCisJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsNCisJCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykpIHsNCisJCQkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQ6DQorCQkJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fRVJST1JTOg0KKwkJCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1dBUk5JTkdTOiB7DQorCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOw0KKwkJCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgbnVsbCk7DQorCQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBkaWFnbm9zdGljKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlIHsNCisJCQkJCQkJCXJlc291cmNlVG9EaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZSk7DQorCQkJCQkJCX0NCisNCisJCQkJCQkJaWYgKHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKSB7DQorCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkJCQkJCSB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpOw0KKwkJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJCSB9KTsNCisJCQkJCQkJfQ0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZSB7DQorCQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQorCQkJCX0NCisJCQl9DQorDQorCQkJQE92ZXJyaWRlDQorCQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFJlc291cmNlIHRhcmdldCkgew0KKwkJCQliYXNpY1NldFRhcmdldCh0YXJnZXQpOw0KKwkJCX0NCisNCisJCQlAT3ZlcnJpZGUNCisJCQlwcm90ZWN0ZWQgdm9pZCB1bnNldFRhcmdldChSZXNvdXJjZSB0YXJnZXQpIHsNCisJCQkJYmFzaWNVbnNldFRhcmdldCh0YXJnZXQpOw0KKwkJCX0NCisJCX07DQorDQorCS8qKg0KKwkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPQ0KKwkJbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgew0KKwkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgew0KKwkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7DQorCQkJCXRyeSB7DQorCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7DQorCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOw0KKwkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsNCisJCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7DQorDQorCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsNCisJCQkJCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7DQorCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwNCisJCQkJCQkJCSAgICBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsNCisJCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIGZhbHNlKTsNCisJCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgew0KKwkJCQkJCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsNCisJCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCQkJfQ0KKwkJCQkJCQkJCQllbHNlIGlmICghc2F2ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgew0KKwkJCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOw0KKwkJCQkJCQkJCQl9DQorCQkJCQkJCQkJfQ0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorDQorCQkJCQkJCXJldHVybiB0cnVlOw0KKwkJCQkJCX0NCisNCisJCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsNCisJCQkJCQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgew0KKwkJCQkJCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsNCisJCQkJCQl9DQorCQkJCQl9DQorDQorCQkJCQlmaW5hbCBSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7DQorCQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7DQorDQorCQkJCQlpZiAoIXZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgew0KKwkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkJCQkJKG5ldyBSdW5uYWJsZSgpIHsNCisJCQkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCQkJIHJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsNCisJCQkJCQkJCQkgaWYgKCFpc0RpcnR5KCkpIHsNCisJCQkJCQkJCQkJIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoQ29tcmVsRWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQkJCQkJCQkgfQ0KKwkJCQkJCQkJIH0NCisJCQkJCQkJIH0pOw0KKwkJCQkJfQ0KKw0KKwkJCQkJaWYgKCF2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsNCisJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJCShuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJCSBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7DQorCQkJCQkJCQkJIGlmIChnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpID09IENvbXJlbEVkaXRvci50aGlzKSB7DQorCQkJCQkJCQkJCSBoYW5kbGVBY3RpdmF0ZSgpOw0KKwkJCQkJCQkJCSB9DQorCQkJCQkJCQkgfQ0KKwkJCQkJCQkgfSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJCQlDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKw0KKwkvKioNCisJICogSGFuZGxlcyBhY3RpdmF0aW9uIG9mIHRoZSBlZGl0b3Igb3IgaXQncyBhc3NvY2lhdGVkIHZpZXdzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoKSB7DQorCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4NCisJCS8vDQorCQlpZiAoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7DQorCQkgIGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsNCisNCisJCSAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCisJCSAgLy8NCisJCSAgc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsNCisJCX0NCisNCisJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsNCisJCQlpZiAoaGFuZGxlRGlydHlDb25mbGljdCgpKSB7DQorCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoQ29tcmVsRWRpdG9yLnRoaXMsIGZhbHNlKTsNCisJCQl9DQorCQkJZWxzZSB7DQorCQkJCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsNCisJCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkgew0KKwkJCWNoYW5nZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHNhdmVkUmVzb3VyY2VzKTsNCisJCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7DQorCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOw0KKwkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgew0KKwkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7DQorCQkJaWYgKGlzRGlydHkoKSkgew0KKwkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpOw0KKwkJCX0NCisJCQllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7DQorDQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgew0KKwkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgew0KKwkJCQkJcmVzb3VyY2UudW5sb2FkKCk7DQorCQkJCQl0cnkgew0KKwkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsNCisJCQkJCX0NCisJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlpZiAoIXJlc291cmNlVG9EaWFnbm9zdGljTWFwLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgew0KKwkJCQkJCQlyZXNvdXJjZVRvRGlhZ25vc3RpY01hcC5wdXQocmVzb3VyY2UsIGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJaWYgKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbi5pc1N0YWxlKGVkaXRvclNlbGVjdGlvbikpIHsNCisJCQkJc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOw0KKwkJCX0NCisNCisJCQl1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbiA9IHRydWU7DQorCQkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24oKTsNCisJCX0NCisJfQ0KKyAgDQorCS8qKg0KKwkgKiBVcGRhdGVzIHRoZSBwcm9ibGVtcyBpbmRpY2F0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbigpIHsNCisJCWlmICh1cGRhdGVQcm9ibGVtSW5kaWNhdGlvbikgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBkaWFnbm9zdGljID0NCisJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYw0KKwkJCQkJKERpYWdub3N0aWMuT0ssDQorCQkJCQkgImNvbXJlbC5lZGl0b3IiLA0KKwkJCQkJIDAsDQorCQkJCQkgbnVsbCwNCisJCQkJCSBuZXcgT2JqZWN0IFtdIHsgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpIH0pOw0KKwkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiByZXNvdXJjZVRvRGlhZ25vc3RpY01hcC52YWx1ZXMoKSkgew0KKwkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQkJZGlhZ25vc3RpYy5hZGQoY2hpbGREaWFnbm9zdGljKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpbnQgbGFzdEVkaXRvclBhZ2UgPSBnZXRQYWdlQ291bnQoKSAtIDE7DQorCQkJaWYgKGxhc3RFZGl0b3JQYWdlID49IDAgJiYgZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSBpbnN0YW5jZW9mIFByb2JsZW1FZGl0b3JQYXJ0KSB7DQorCQkJCSgoUHJvYmxlbUVkaXRvclBhcnQpZ2V0RWRpdG9yKGxhc3RFZGl0b3JQYWdlKSkuc2V0RGlhZ25vc3RpYyhkaWFnbm9zdGljKTsNCisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJCQlzZXRBY3RpdmVQYWdlKGxhc3RFZGl0b3JQYWdlKTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgew0KKwkJCQlQcm9ibGVtRWRpdG9yUGFydCBwcm9ibGVtRWRpdG9yUGFydCA9IG5ldyBQcm9ibGVtRWRpdG9yUGFydCgpOw0KKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXREaWFnbm9zdGljKGRpYWdub3N0aWMpOw0KKwkJCQlwcm9ibGVtRWRpdG9yUGFydC5zZXRNYXJrZXJIZWxwZXIobWFya2VySGVscGVyKTsNCisJCQkJdHJ5IHsNCisJCQkJCWFkZFBhZ2UoKytsYXN0RWRpdG9yUGFnZSwgcHJvYmxlbUVkaXRvclBhcnQsIGdldEVkaXRvcklucHV0KCkpOw0KKwkJCQkJc2V0UGFnZVRleHQobGFzdEVkaXRvclBhZ2UsIHByb2JsZW1FZGl0b3JQYXJ0LmdldFBhcnROYW1lKCkpOw0KKwkJCQkJc2V0QWN0aXZlUGFnZShsYXN0RWRpdG9yUGFnZSk7DQorCQkJCQlzaG93VGFicygpOw0KKwkJCQl9DQorCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCUNvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpZiAobWFya2VySGVscGVyLmhhc01hcmtlcnMoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKSkgew0KKwkJCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2VycyhlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJbWFya2VySGVscGVyLmNyZWF0ZU1hcmtlcnMoZGlhZ25vc3RpYyk7DQorCQkJCQl9DQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQlDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkgew0KKwkJcmV0dXJuDQorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24NCisJCQkJKGdldFNpdGUoKS5nZXRTaGVsbCgpLA0KKwkJCQkgZ2V0U3RyaW5nKCJfVUlfRmlsZUNvbmZsaWN0X2xhYmVsIiksDQorCQkJCSBnZXRTdHJpbmcoIl9XQVJOX0ZpbGVDb25mbGljdCIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBjcmVhdGVzIGEgbW9kZWwgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbEVkaXRvcigpIHsNCisJCXN1cGVyKCk7DQorCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7DQorCQkvLyBDcmVhdGUgYW4gYWRhcHRlciBmYWN0b3J5IHRoYXQgeWllbGRzIGl0ZW0gcHJvdmlkZXJzLg0KKwkJLy8NCisJCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsNCisNCisJCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IENvbXJlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOw0KKwkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCisNCisJCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZSBleGVjdXRlZC4NCisJCS8vDQorCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsNCisNCisJCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuDQorCQkvLw0KKwkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyDQorCQkJKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsNCisJCQkJIHB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsNCisJCQkJCSBnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkJIChuZXcgUnVubmFibGUoKSB7DQorCQkJCQkJCSAgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCQkJICBmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7DQorDQorCQkJCQkJCQkgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuDQorCQkJCQkJCQkgIC8vDQorCQkJCQkJCQkgIENvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaylldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsNCisJCQkJCQkJCSAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsNCisJCQkJCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsNCisJCQkJCQkJCSAgfQ0KKwkJCQkJCQkJICBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiAhcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgew0KKwkJCQkJCQkJCSAgcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOw0KKwkJCQkJCQkJICB9DQorCQkJCQkJCSAgfQ0KKwkJCQkJCSAgfSk7DQorCQkJCSB9DQorCQkJIH0pOw0KKw0KKwkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLg0KKwkJLy8NCisJCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBoZXJlIGZvciB0aGUgbGlzdGVuZXIgdG8gYmUgYWJsZSB0byBjYWxsIGl0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJCQlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsNCisJCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIHNldHMgdGhlIHNlbGVjdGlvbiBpbnRvIHdoaWNoZXZlciB2aWV3ZXIgaXMgYWN0aXZlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7DQorCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247DQorCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5Lg0KKwkJLy8NCisJCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KKwkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0NCisJCQkJbmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mIHRoZSBlZGl0b3IuDQorCQkJCQkJLy8NCisJCQkJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7DQorCQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX07DQorCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgZWRpdGluZyBkb21haW4gYXMgcmVxdWlyZWQgYnkgdGhlIHtAbGluayBJRWRpdGluZ0RvbWFpblByb3ZpZGVyfSBpbnRlcmZhY2UuDQorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59DQorCSAqIGFuZCBmb3Igc3VwcG9ydGluZyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsNCisJCXJldHVybiBlZGl0aW5nRG9tYWluOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGNsYXNzIFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgUmV2ZXJzZUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQorCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7DQorCQkJT2JqZWN0IHBhcmVudCA9IHN1cGVyLmdldFBhcmVudChvYmplY3QpOw0KKwkJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9TRVQgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyZW50KSkudG9BcnJheSgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUBPdmVycmlkZQ0KKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgew0KKwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsNCisJCQlyZXR1cm4gcGFyZW50ICE9IG51bGw7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7DQorCQkJcmV0dXJuIG51bGw7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyUGFuZShWaWV3ZXJQYW5lIHZpZXdlclBhbmUpIHsNCisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSB2aWV3ZXJQYW5lKSB7DQorCQkJaWYgKGN1cnJlbnRWaWV3ZXJQYW5lICE9IG51bGwpIHsNCisJCQkJY3VycmVudFZpZXdlclBhbmUuc2hvd0ZvY3VzKGZhbHNlKTsNCisJCQl9DQorCQkJY3VycmVudFZpZXdlclBhbmUgPSB2aWV3ZXJQYW5lOw0KKwkJfQ0KKwkJc2V0Q3VycmVudFZpZXdlcihjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG9uZSBjb250ZW50IHZpZXdlciwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBwYWdlIG9yIHRoZSBvdXRsaW5lIHZpZXcsIGlmIGl0IGhhcyBmb2N1cywNCisJICogaXMgdGhlIGN1cnJlbnQgb25lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0Q3VycmVudFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7DQorCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLg0KKwkJLy8NCisJCWlmIChjdXJyZW50Vmlld2VyICE9IHZpZXdlcikgew0KKwkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgew0KKwkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4NCisJCQkJLy8NCisJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0NCisJCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KKwkJCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhlIHNlY3Rpb24uDQorCQkJCQkJLy8NCisJCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsNCisJCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQl9DQorDQorCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuDQorCQkJLy8NCisJCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsKSB7DQorCQkJCWN1cnJlbnRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7DQorCQkJfQ0KKw0KKwkJCS8vIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmV3IG9uZS4NCisJCQkvLw0KKwkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgew0KKwkJCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7DQorCQkJfQ0KKw0KKwkJCS8vIFJlbWVtYmVyIGl0Lg0KKwkJCS8vDQorCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsNCisNCisJCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzIHNlbGVjdGlvbi4NCisJCQkvLw0KKwkJCXNldFNlbGVjdGlvbihjdXJyZW50Vmlld2VyID09IG51bGwgPyBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZIDogY3VycmVudFZpZXdlci5nZXRTZWxlY3Rpb24oKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB0aGUgdmlld2VyIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSVZpZXdlclByb3ZpZGVyfSBpbnRlcmZhY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsNCisJCXJldHVybiBjdXJyZW50Vmlld2VyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgew0KKwkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOw0KKwkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsNCisJCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsNCisJCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsNCisJCU1lbnUgbWVudT0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7DQorCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7DQorCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsNCisNCisJCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOw0KKwkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9Ow0KKwkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOw0KKwkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7DQorCQlVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSShnZXRFZGl0b3JJbnB1dCgpKTsNCisJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOw0KKwkJdHJ5IHsNCisJCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4NCisJCQkvLw0KKwkJCXJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCWV4Y2VwdGlvbiA9IGU7DQorCQkJcmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsNCisJCX0NCisNCisJCURpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGFuYWx5emVSZXNvdXJjZVByb2JsZW1zKHJlc291cmNlLCBleGNlcHRpb24pOw0KKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7DQorCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCAgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMocmVzb3VyY2UsIGV4Y2VwdGlvbikpOw0KKwkJfQ0KKwkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChwcm9ibGVtSW5kaWNhdGlvbkFkYXB0ZXIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgZGlhZ25vc3RpYyBkZXNjcmliaW5nIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIGxpc3RlZCBpbiB0aGUgcmVzb3VyY2UNCisJICogYW5kIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIChpZiBhbnkpLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIERpYWdub3N0aWMgYW5hbHl6ZVJlc291cmNlUHJvYmxlbXMoUmVzb3VyY2UgcmVzb3VyY2UsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCWlmICghcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpIHx8ICFyZXNvdXJjZS5nZXRXYXJuaW5ncygpLmlzRW1wdHkoKSkgew0KKwkJCUJhc2ljRGlhZ25vc3RpYyBiYXNpY0RpYWdub3N0aWMgPQ0KKwkJCQluZXcgQmFzaWNEaWFnbm9zdGljDQorCQkJCQkoRGlhZ25vc3RpYy5FUlJPUiwNCisJCQkJCSAiY29tcmVsLmVkaXRvciIsDQorCQkJCQkgMCwNCisJCQkJCSBnZXRTdHJpbmcoIl9VSV9DcmVhdGVNb2RlbEVycm9yX21lc3NhZ2UiLCByZXNvdXJjZS5nZXRVUkkoKSksDQorCQkJCQkgbmV3IE9iamVjdCBbXSB7IGV4Y2VwdGlvbiA9PSBudWxsID8gKE9iamVjdClyZXNvdXJjZSA6IGV4Y2VwdGlvbiB9KTsNCisJCQliYXNpY0RpYWdub3N0aWMubWVyZ2UoRWNvcmVVdGlsLmNvbXB1dGVEaWFnbm9zdGljKHJlc291cmNlLCB0cnVlKSk7DQorCQkJcmV0dXJuIGJhc2ljRGlhZ25vc3RpYzsNCisJCX0NCisJCWVsc2UgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7DQorCQkJcmV0dXJuDQorCQkJCW5ldyBCYXNpY0RpYWdub3N0aWMNCisJCQkJCShEaWFnbm9zdGljLkVSUk9SLA0KKwkJCQkJICJjb21yZWwuZWRpdG9yIiwNCisJCQkJCSAwLA0KKwkJCQkJIGdldFN0cmluZygiX1VJX0NyZWF0ZU1vZGVsRXJyb3JfbWVzc2FnZSIsIHJlc291cmNlLmdldFVSSSgpKSwNCisJCQkJCSBuZXcgT2JqZWN0W10geyBleGNlcHRpb24gfSk7DQorCQl9DQorCQllbHNlIHsNCisJCQlyZXR1cm4gRGlhZ25vc3RpYy5PS19JTlNUQU5DRTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgew0KKwkJLy8gQ3JlYXRlcyB0aGUgbW9kZWwgZnJvbSB0aGUgZWRpdG9yIGlucHV0DQorCQkvLw0KKwkJY3JlYXRlTW9kZWwoKTsNCisNCisJCS8vIE9ubHkgY3JlYXRlcyB0aGUgb3RoZXIgcGFnZXMgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGVkaXRlZA0KKwkJLy8NCisJCWlmICghZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJLy8gQ3JlYXRlIGEgcGFnZSBmb3IgdGhlIHNlbGVjdGlvbiB0cmVlIHZpZXcuDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBDb21yZWxFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJVHJlZSB0cmVlID0gbmV3IFRyZWUoY29tcG9zaXRlLCBTV1QuTVVMVEkpOw0KKwkJCQkJCQlUcmVlVmlld2VyIG5ld1RyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsNCisJCQkJCQkJcmV0dXJuIG5ld1RyZWVWaWV3ZXI7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIgPSAoVHJlZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXNlbGVjdGlvblZpZXdlci5zZXRJbnB1dChlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKwkJCQlzZWxlY3Rpb25WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLCB0cnVlKTsNCisJCQkJdmlld2VyUGFuZS5zZXRUaXRsZShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpOw0KKw0KKwkJCQluZXcgQWRhcHRlckZhY3RvcnlUcmVlRWRpdG9yKHNlbGVjdGlvblZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Ioc2VsZWN0aW9uVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWwiKSk7DQorCQkJfQ0KKw0KKwkJCS8vIENyZWF0ZSBhIHBhZ2UgZm9yIHRoZSBwYXJlbnQgdHJlZSB2aWV3Lg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgQ29tcmVsRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCVRyZWUgdHJlZSA9IG5ldyBUcmVlKGNvbXBvc2l0ZSwgU1dULk1VTFRJKTsNCisJCQkJCQkJVHJlZVZpZXdlciBuZXdUcmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIodHJlZSk7DQorCQkJCQkJCXJldHVybiBuZXdUcmVlVmlld2VyOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisNCisJCQkJcGFyZW50Vmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJcGFyZW50Vmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgzMCk7DQorCQkJCXBhcmVudFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFJldmVyc2VBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQlwYXJlbnRWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHBhcmVudFZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9QYXJlbnRQYWdlX2xhYmVsIikpOw0KKwkJCX0NCisNCisJCQkvLyBUaGlzIGlzIHRoZSBwYWdlIGZvciB0aGUgbGlzdCB2aWV3ZXINCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIENvbXJlbEVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IExpc3RWaWV3ZXIoY29tcG9zaXRlKTsNCisJCQkJCQl9DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIHZvaWQgcmVxdWVzdEFjdGl2YXRpb24oKSB7DQorCQkJCQkJCXN1cGVyLnJlcXVlc3RBY3RpdmF0aW9uKCk7DQorCQkJCQkJCXNldEN1cnJlbnRWaWV3ZXJQYW5lKHRoaXMpOw0KKwkJCQkJCX0NCisJCQkJCX07DQorCQkJCXZpZXdlclBhbmUuY3JlYXRlQ29udHJvbChnZXRDb250YWluZXIoKSk7DQorCQkJCWxpc3RWaWV3ZXIgPSAoTGlzdFZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKwkJCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IobGlzdFZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9MaXN0UGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRyZWUgdmlld2VyDQorCQkJLy8NCisJCQl7DQorCQkJCVZpZXdlclBhbmUgdmlld2VyUGFuZSA9DQorCQkJCQluZXcgVmlld2VyUGFuZShnZXRTaXRlKCkuZ2V0UGFnZSgpLCBDb21yZWxFZGl0b3IudGhpcykgew0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCisJCQkJCQkJcmV0dXJuIG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKwkJCQl0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisJCQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorCQkJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVRyZWVFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCksIGFkYXB0ZXJGYWN0b3J5KTsNCisNCisJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IodHJlZVZpZXdlcik7DQorCQkJCWludCBwYWdlSW5kZXggPSBhZGRQYWdlKHZpZXdlclBhbmUuZ2V0Q29udHJvbCgpKTsNCisJCQkJc2V0UGFnZVRleHQocGFnZUluZGV4LCBnZXRTdHJpbmcoIl9VSV9UcmVlUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHZpZXdlci4NCisJCQkvLw0KKwkJCXsNCisJCQkJVmlld2VyUGFuZSB2aWV3ZXJQYW5lID0NCisJCQkJCW5ldyBWaWV3ZXJQYW5lKGdldFNpdGUoKS5nZXRQYWdlKCksIENvbXJlbEVkaXRvci50aGlzKSB7DQorCQkJCQkJQE92ZXJyaWRlDQorCQkJCQkJcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KKwkJCQkJCQlyZXR1cm4gbmV3IFRhYmxlVmlld2VyKGNvbXBvc2l0ZSk7DQorCQkJCQkJfQ0KKwkJCQkJCUBPdmVycmlkZQ0KKwkJCQkJCXB1YmxpYyB2b2lkIHJlcXVlc3RBY3RpdmF0aW9uKCkgew0KKwkJCQkJCQlzdXBlci5yZXF1ZXN0QWN0aXZhdGlvbigpOw0KKwkJCQkJCQlzZXRDdXJyZW50Vmlld2VyUGFuZSh0aGlzKTsNCisJCQkJCQl9DQorCQkJCQl9Ow0KKwkJCQl2aWV3ZXJQYW5lLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpOw0KKwkJCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcil2aWV3ZXJQYW5lLmdldFZpZXdlcigpOw0KKw0KKwkJCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7DQorCQkJCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOw0KKwkJCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsNCisJCQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCisJCQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOw0KKw0KKwkJCQlUYWJsZUNvbHVtbiBvYmplY3RDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsNCisJCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMywgMTAwLCB0cnVlKSk7DQorCQkJCW9iamVjdENvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX09iamVjdENvbHVtbl9sYWJlbCIpKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsNCisNCisJCQkJVGFibGVDb2x1bW4gc2VsZkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOw0KKwkJCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyLCAxMDAsIHRydWUpKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRUZXh0KGdldFN0cmluZygiX1VJX1NlbGZDb2x1bW5fbGFiZWwiKSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOw0KKw0KKwkJCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKG5ldyBTdHJpbmcgW10geyJhIiwgImIifSk7DQorCQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQorDQorCQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHRhYmxlVmlld2VyKTsNCisJCQkJaW50IHBhZ2VJbmRleCA9IGFkZFBhZ2Uodmlld2VyUGFuZS5nZXRDb250cm9sKCkpOw0KKwkJCQlzZXRQYWdlVGV4dChwYWdlSW5kZXgsIGdldFN0cmluZygiX1VJX1RhYmxlUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHRyZWUgdmlld2VyLg0KKwkJCS8vDQorCQkJew0KKwkJCQlWaWV3ZXJQYW5lIHZpZXdlclBhbmUgPQ0KKwkJCQkJbmV3IFZpZXdlclBhbmUoZ2V0U2l0ZSgpLmdldFBhZ2UoKSwgQ29tcmVsRWRpdG9yLnRoaXMpIHsNCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgY29tcG9zaXRlKSB7DQorCQkJCQkJCXJldHVybiBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUpOw0KKwkJCQkJCX0NCisJCQkJCQlAT3ZlcnJpZGUNCisJCQkJCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWN0aXZhdGlvbigpIHsNCisJCQkJCQkJc3VwZXIucmVxdWVzdEFjdGl2YXRpb24oKTsNCisJCQkJCQkJc2V0Q3VycmVudFZpZXdlclBhbmUodGhpcyk7DQorCQkJCQkJfQ0KKwkJCQkJfTsNCisJCQkJdmlld2VyUGFuZS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKTsNCisNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zID0gKFRyZWVWaWV3ZXIpdmlld2VyUGFuZS5nZXRWaWV3ZXIoKTsNCisNCisJCQkJVHJlZSB0cmVlID0gdHJlZVZpZXdlcldpdGhDb2x1bW5zLmdldFRyZWUoKTsNCisJCQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBGaWxsTGF5b3V0KCkpOw0KKwkJCQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7DQorCQkJCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOw0KKw0KKwkJCQlUcmVlQ29sdW1uIG9iamVjdENvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsNCisJCQkJb2JqZWN0Q29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfT2JqZWN0Q29sdW1uX2xhYmVsIikpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOw0KKwkJCQlvYmplY3RDb2x1bW4uc2V0V2lkdGgoMjUwKTsNCisNCisJCQkJVHJlZUNvbHVtbiBzZWxmQ29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOw0KKwkJCQlzZWxmQ29sdW1uLnNldFRleHQoZ2V0U3RyaW5nKCJfVUlfU2VsZkNvbHVtbl9sYWJlbCIpKTsNCisJCQkJc2VsZkNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7DQorCQkJCXNlbGZDb2x1bW4uc2V0V2lkdGgoMjAwKTsNCisNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZyBbXSB7ImEiLCAiYiJ9KTsNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJdHJlZVZpZXdlcldpdGhDb2x1bW5zLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKw0KKwkJCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyV2l0aENvbHVtbnMpOw0KKwkJCQlpbnQgcGFnZUluZGV4ID0gYWRkUGFnZSh2aWV3ZXJQYW5lLmdldENvbnRyb2woKSk7DQorCQkJCXNldFBhZ2VUZXh0KHBhZ2VJbmRleCwgZ2V0U3RyaW5nKCJfVUlfVHJlZVdpdGhDb2x1bW5zUGFnZV9sYWJlbCIpKTsNCisJCQl9DQorDQorCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYw0KKwkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCQkJCQkgc2V0QWN0aXZlUGFnZSgwKTsNCisJCQkJCSB9DQorCQkJCSB9KTsNCisJCX0NCisNCisJCS8vIEVuc3VyZXMgdGhhdCB0aGlzIGVkaXRvciB3aWxsIG9ubHkgZGlzcGxheSB0aGUgcGFnZSdzIHRhYg0KKwkJLy8gYXJlYSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBwYWdlDQorCQkvLw0KKwkJZ2V0Q29udGFpbmVyKCkuYWRkQ29udHJvbExpc3RlbmVyDQorCQkJKG5ldyBDb250cm9sQWRhcHRlcigpIHsNCisJCQkJYm9vbGVhbiBndWFyZCA9IGZhbHNlOw0KKwkJCQlAT3ZlcnJpZGUNCisJCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGV2ZW50KSB7DQorCQkJCQlpZiAoIWd1YXJkKSB7DQorCQkJCQkJZ3VhcmQgPSB0cnVlOw0KKwkJCQkJCWhpZGVUYWJzKCk7DQorCQkJCQkJZ3VhcmQgPSBmYWxzZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCSB9KTsNCisNCisJCWdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMNCisJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkgcHVibGljIHZvaWQgcnVuKCkgew0KKwkJCQkJIHVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCQkJCSB9DQorCQkJIH0pOw0KKwl9DQorDQorCS8qKg0KKwkgKiBJZiB0aGVyZSBpcyBqdXN0IG9uZSBwYWdlIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvciBwYXJ0LA0KKwkgKiB0aGlzIGhpZGVzIHRoZSBzaW5nbGUgdGFiIGF0IHRoZSBib3R0b20uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBoaWRlVGFicygpIHsNCisJCWlmIChnZXRQYWdlQ291bnQoKSA8PSAxKSB7DQorCQkJc2V0UGFnZVRleHQoMCwgIiIpOw0KKwkJCWlmIChnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIENUYWJGb2xkZXIpIHsNCisJCQkJKChDVGFiRm9sZGVyKWdldENvbnRhaW5lcigpKS5zZXRUYWJIZWlnaHQoMSk7DQorCQkJCVBvaW50IHBvaW50ID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2l6ZSgpOw0KKwkJCQlnZXRDb250YWluZXIoKS5zZXRTaXplKHBvaW50LngsIHBvaW50LnkgKyA2KTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFnZSBpbiB0aGUgbXVsdGktcGFnZSBlZGl0b3IgcGFydCwNCisJICogdGhpcyBzaG93cyB0aGUgdGFicyBhdCB0aGUgYm90dG9tLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgc2hvd1RhYnMoKSB7DQorCQlpZiAoZ2V0UGFnZUNvdW50KCkgPiAxKSB7DQorCQkJc2V0UGFnZVRleHQoMCwgZ2V0U3RyaW5nKCJfVUlfU2VsZWN0aW9uUGFnZV9sYWJlbCIpKTsNCisJCQlpZiAoZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBDVGFiRm9sZGVyKSB7DQorCQkJCSgoQ1RhYkZvbGRlcilnZXRDb250YWluZXIoKSkuc2V0VGFiSGVpZ2h0KFNXVC5ERUZBVUxUKTsNCisJCQkJUG9pbnQgcG9pbnQgPSBnZXRDb250YWluZXIoKS5nZXRTaXplKCk7DQorCQkJCWdldENvbnRhaW5lcigpLnNldFNpemUocG9pbnQueCwgcG9pbnQueSAtIDYpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhY3RpdmUgdmlld2VyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgew0KKwkJc3VwZXIucGFnZUNoYW5nZShwYWdlSW5kZXgpOw0KKw0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7DQorCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBob3cgdGhlIGZyYW1ld29yayBkZXRlcm1pbmVzIHdoaWNoIGludGVyZmFjZXMgd2UgaW1wbGVtZW50Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsNCisJCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIHNob3dPdXRsaW5lVmlldygpID8gZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgOiBudWxsOw0KKwkJfQ0KKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7DQorCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7DQorCQl9DQorCQllbHNlIGlmIChrZXkuZXF1YWxzKElHb3RvTWFya2VyLmNsYXNzKSkgew0KKwkJCXJldHVybiB0aGlzOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IG91dGxpbmVyLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgew0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7DQorCQkJLy8gVGhlIGNvbnRlbnQgb3V0bGluZSBpcyBqdXN0IGEgdHJlZS4NCisJCQkvLw0KKwkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7DQorCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7DQorDQorCQkJCQkvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLg0KKwkJCQkJLy8NCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCisJCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0SW5wdXQoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKTsNCisNCisJCQkJCS8vIE1ha2Ugc3VyZSBvdXIgcG9wdXBzIHdvcmsuDQorCQkJCQkvLw0KKwkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOw0KKw0KKwkJCQkJaWYgKCFlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7DQorCQkJCQkgIC8vIFNlbGVjdCB0aGUgcm9vdCBvYmplY3QgaW4gdGhlIHZpZXcuDQorCQkJCQkgIC8vDQorCQkJCQkgIGNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKSwgdHJ1ZSk7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJQE92ZXJyaWRlDQorCQkJCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsNCisJCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOw0KKwkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOw0KKwkJCQl9DQorDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsNCisJCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7DQorCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsNCisNCisJCQkvLyBMaXN0ZW4gdG8gc2VsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBpdCBpcyBhIHNwZWNpYWwgd2F5Lg0KKwkJCS8vDQorCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcg0KKwkJCQkobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQorCQkJCQkgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5Lg0KKwkJCQkJIC8vDQorCQkJCQkgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCisJCQkJCQkgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOw0KKwkJCQkJIH0NCisJCQkJIH0pOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lUGFnZTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBJUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7DQorCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgew0KKwkJCXByb3BlcnR5U2hlZXRQYWdlID0NCisJCQkJbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgew0KKwkJCQkJQE92ZXJyaWRlDQorCQkJCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgew0KKwkJCQkJCUNvbXJlbEVkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7DQorCQkJCQkJQ29tcmVsRWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsNCisJCQkJCX0NCisNCisJCQkJCUBPdmVycmlkZQ0KKwkJCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7DQorCQkJCQkJc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsNCisJCQkJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsNCisJCQkJCX0NCisJCQkJfTsNCisJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KKwkJfQ0KKw0KKwkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGRlYWxzIHdpdGggaG93IHdlIHdhbnQgc2VsZWN0aW9uIGluIHRoZSBvdXRsaW5lciB0byBhZmZlY3QgdGhlIG90aGVyIHZpZXdzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7DQorCQkJSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5pdGVyYXRvcigpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgew0KKwkJCQkvLyBHZXQgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQuDQorCQkJCS8vDQorCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsNCisNCisJCQkJLy8gSWYgaXQncyB0aGUgc2VsZWN0aW9uIHZpZXdlciwgdGhlbiB3ZSB3YW50IGl0IHRvIHNlbGVjdCB0aGUgc2FtZSBzZWxlY3Rpb24gYXMgdGhpcyBzZWxlY3Rpb24uDQorCQkJCS8vDQorCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKSA9PSBzZWxlY3Rpb25WaWV3ZXIpIHsNCisJCQkJCUFycmF5TGlzdDxPYmplY3Q+IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCisJCQkJCXNlbGVjdGlvbkxpc3QuYWRkKHNlbGVjdGVkRWxlbWVudCk7DQorCQkJCQl3aGlsZSAoc2VsZWN0ZWRFbGVtZW50cy5oYXNOZXh0KCkpIHsNCisJCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChzZWxlY3RlZEVsZW1lbnRzLm5leHQoKSk7DQorCQkJCQl9DQorDQorCQkJCQkvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0Lg0KKwkJCQkJLy8NCisJCQkJCXNlbGVjdGlvblZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uTGlzdCkpOw0KKwkJCQl9DQorCQkJCWVsc2Ugew0KKwkJCQkJLy8gU2V0IHRoZSBpbnB1dCB0byB0aGUgd2lkZ2V0Lg0KKwkJCQkJLy8NCisJCQkJCWlmIChjdXJyZW50Vmlld2VyUGFuZS5nZXRWaWV3ZXIoKS5nZXRJbnB1dCgpICE9IHNlbGVjdGVkRWxlbWVudCkgew0KKwkJCQkJCWN1cnJlbnRWaWV3ZXJQYW5lLmdldFZpZXdlcigpLnNldElucHV0KHNlbGVjdGVkRWxlbWVudCk7DQorCQkJCQkJY3VycmVudFZpZXdlclBhbmUuc2V0VGl0bGUoc2VsZWN0ZWRFbGVtZW50KTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBJRWRpdG9yUGFydH0gYW5kIHNpbXBseSB0ZXN0cyB0aGUgY29tbWFuZCBzdGFjay4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgew0KKwkJcmV0dXJuICgoQmFzaWNDb21tYW5kU3RhY2spZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSUVkaXRvclBhcnR9IGFuZCBzaW1wbHkgc2F2ZXMgdGhlIG1vZGVsIGZpbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQorCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLg0KKwkJLy8NCisJCWZpbmFsIE1hcDxPYmplY3QsIE9iamVjdD4gc2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCisJCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsNCisNCisJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4NCisJCS8vDQorCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0NCisJCQluZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgew0KKwkJCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuDQorCQkJCS8vDQorCQkJCUBPdmVycmlkZQ0KKwkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KKwkJCQkJLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4NCisJCQkJCS8vDQorCQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsNCisJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsNCisJCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpICYmICFlZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7DQorCQkJCQkJCXRyeSB7DQorCQkJCQkJCQlsb25nIHRpbWVTdGFtcCA9IHJlc291cmNlLmdldFRpbWVTdGFtcCgpOw0KKwkJCQkJCQkJcmVzb3VyY2Uuc2F2ZShzYXZlT3B0aW9ucyk7DQorCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VGltZVN0YW1wKCkgIT0gdGltZVN0YW1wKSB7DQorCQkJCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsNCisJCQkJCQkJCX0NCisJCQkJCQkJfQ0KKwkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQkJCQkJcmVzb3VyY2VUb0RpYWdub3N0aWNNYXAucHV0KHJlc291cmNlLCBhbmFseXplUmVzb3VyY2VQcm9ibGVtcyhyZXNvdXJjZSwgZXhjZXB0aW9uKSk7DQorCQkJCQkJCX0NCisJCQkJCQkJZmlyc3QgPSBmYWxzZTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQl9Ow0KKw0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisJCXRyeSB7DQorCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuDQorCQkJLy8NCisJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7DQorDQorCQkJLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLg0KKwkJCS8vDQorCQkJKChCYXNpY0NvbW1hbmRTdGFjayllZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7DQorCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOw0KKwkJfQ0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4NCisJCQkvLw0KKwkJCUNvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uID0gdHJ1ZTsNCisJCXVwZGF0ZVByb2JsZW1JbmRpY2F0aW9uKCk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLg0KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVVJJIGNvbnZlcnRlciBmcm9tIHRoZSBlZGl0b3IncyByZXNvdXJjZSBzZXQgdG8gdHJ5IHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtLiANCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7DQorCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KKwkJdHJ5IHsNCisJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOw0KKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KKwkJCQlyZXN1bHQgPSB0cnVlOw0KKwkJCQlzdHJlYW0uY2xvc2UoKTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCS8vIElnbm9yZQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBhbHdheXMgcmV0dXJucyB0cnVlIGJlY2F1c2UgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgew0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsNCisJCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsNCisJCXNhdmVBc0RpYWxvZy5vcGVuKCk7DQorCQlJUGF0aCBwYXRoID0gc2F2ZUFzRGlhbG9nLmdldFJlc3VsdCgpOw0KKwkJaWYgKHBhdGggIT0gbnVsbCkgew0KKwkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7DQorCQkJaWYgKGZpbGUgIT0gbnVsbCkgew0KKwkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgew0KKwkJKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLnNldFVSSSh1cmkpOw0KKwkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsNCisJCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7DQorCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9DQorCQkJZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/DQorCQkJCWdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDoNCisJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCisJCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgew0KKwkJdHJ5IHsNCisJCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7DQorCQkJCVN0cmluZyB1cmlBdHRyaWJ1dGUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEVWYWxpZGF0b3IuVVJJX0FUVFJJQlVURSwgbnVsbCk7DQorCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgew0KKwkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsNCisJCQkJCUVPYmplY3QgZU9iamVjdCA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRFT2JqZWN0KHVyaSwgdHJ1ZSk7DQorCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7DQorCQkJCQkgIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb25zLnNpbmdsZXRvbihlZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUNvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsNCisJCXNldFNpdGUoc2l0ZSk7DQorCQlzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOw0KKwkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsNCisJCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7DQorCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsNCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsNCisJCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsKSB7DQorCQkJY3VycmVudFZpZXdlclBhbmUuc2V0Rm9jdXMoKTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCWdldENvbnRyb2woZ2V0QWN0aXZlUGFnZSgpKS5zZXRGb2N1cygpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQorCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gcmV0dXJuIHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7DQorCQlyZXR1cm4gZWRpdG9yU2VsZWN0aW9uOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byBzZXQgdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4NCisJICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQllZGl0b3JTZWxlY3Rpb24gPSBzZWxlY3Rpb247DQorDQorCQlmb3IgKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgOiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7DQorCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOw0KKwkJfQ0KKwkJc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/DQorCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6IGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOw0KKw0KKwkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsNCisJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsNCisJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOw0KKwkJCQlzd2l0Y2ggKGNvbGxlY3Rpb24uc2l6ZSgpKSB7DQorCQkJCQljYXNlIDA6IHsNCisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQljYXNlIDE6IHsNCisJCQkJCQlTdHJpbmcgdGV4dCA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7DQorCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsIHRleHQpKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWRlZmF1bHQ6IHsNCisJCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX011bHRpT2JqZWN0U2VsZWN0ZWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24uc2l6ZSgpKSkpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2Ugew0KKwkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gdGhlIHBsdWdpbidzIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsNCisJCXJldHVybiBDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7DQorCX0NCisNCisJLyoqDQorCSAqIFRoaXMgbG9va3MgdXAgYSBzdHJpbmcgaW4gcGx1Z2luLnByb3BlcnRpZXMsIG1ha2luZyBhIHN1YnN0aXR1dGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7DQorCQlyZXR1cm4gQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZyhrZXksIG5ldyBPYmplY3QgW10geyBzMSB9KTsNCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscCBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7DQorCQkoKElNZW51TGlzdGVuZXIpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgew0KKwkJcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsNCisJCXJldHVybiBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGlvbkJhcnMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsNCisJCXJldHVybiBhZGFwdGVyRmFjdG9yeTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KKwkJdXBkYXRlUHJvYmxlbUluZGljYXRpb24gPSBmYWxzZTsNCisNCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOw0KKw0KKwkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsNCisNCisJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsNCisNCisJCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsNCisJCQlnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsNCisJCX0NCisNCisJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7DQorCQkJcHJvcGVydHlTaGVldFBhZ2UuZGlzcG9zZSgpOw0KKwkJfQ0KKw0KKwkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7DQorCQkJY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsNCisJCX0NCisNCisJCXN1cGVyLmRpc3Bvc2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSBvdXRsaW5lIHZpZXcgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL3NyYy9jb21yZWwvcHJlc2VudGF0aW9uL0NvbXJlbEVkaXRvclBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5lZGl0b3Ivc3JjL2NvbXJlbC9wcmVzZW50YXRpb24vQ29tcmVsRWRpdG9yUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwY2NiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL3NyYy9jb21yZWwvcHJlc2VudGF0aW9uL0NvbXJlbEVkaXRvclBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwucHJlc2VudGF0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5FY2xpcHNlVUlQbHVnaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQorDQorLyoqDQorICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBDb21yZWwgZWRpdG9yIHBsdWdpbi4NCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tcmVsRWRpdG9yUGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcmVsRWRpdG9yUGx1Z2luIElOU1RBTkNFID0gbmV3IENvbXJlbEVkaXRvclBsdWdpbigpOw0KKwkNCisJLyoqDQorCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcmVsRWRpdG9yUGx1Z2luKCkgew0KKwkJc3VwZXINCisJCQkobmV3IFJlc291cmNlTG9jYXRvciBbXSB7DQorCQkJfSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFBsdWdpblJlc291cmNlTG9jYXRvcigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisJDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisJDQorCS8qKg0KKwkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVVJUGx1Z2luIHsNCisJCS8qKg0KKwkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgew0KKwkJCXN1cGVyKCk7DQorCQ0KKwkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuDQorCQkJLy8NCisJCQlwbHVnaW4gPSB0aGlzOw0KKwkJfQ0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZWRpdG9yL3NyYy9jb21yZWwvcHJlc2VudGF0aW9uL0NvbXJlbE1vZGVsV2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9zcmMvY29tcmVsL3ByZXNlbnRhdGlvbi9Db21yZWxNb2RlbFdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTQ3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmVkaXRvci9zcmMvY29tcmVsL3ByZXNlbnRhdGlvbi9Db21yZWxNb2RlbFdpemFyZC5qYXZhCkBAIC0wLDAgKzEsNjMyIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnByZXNlbnRhdGlvbjsNCisNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwucHJvdmlkZXIuQ29tcmVsRWRpdFBsdWdpbjsNCisNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgYSBzaW1wbGUgd2l6YXJkIGZvciBjcmVhdGluZyBhIG5ldyBtb2RlbCBmaWxlLg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxNb2RlbFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgew0KKwkvKioNCisJICogVGhlIHN1cHBvcnRlZCBleHRlbnNpb25zIGZvciBjcmVhdGVkIGZpbGVzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gRklMRV9FWFRFTlNJT05TID0NCisJCUNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29tcmVsRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikuc3BsaXQoIlxccyosXFxzKiIpKSk7DQorDQorCS8qKg0KKwkgKiBBIGZvcm1hdHRlZCBsaXN0IG9mIHN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnMsIHN1aXRhYmxlIGZvciBkaXNwbGF5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVEX0ZJTEVfRVhURU5TSU9OUyA9DQorCQlDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29tcmVsRWRpdG9yRmlsZW5hbWVFeHRlbnNpb25zIikucmVwbGFjZUFsbCgiXFxzKixcXHMqIiwgIiwgIik7DQorDQorCS8qKg0KKwkgKiBUaGlzIGNhY2hlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21yZWxQYWNrYWdlIGNvbXJlbFBhY2thZ2UgPSBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRTsNCisNCisJLyoqDQorCSAqIFRoaXMgY2FjaGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXJlbEZhY3RvcnkgY29tcmVsRmFjdG9yeSA9IGNvbXJlbFBhY2thZ2UuZ2V0Q29tcmVsRmFjdG9yeSgpOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgZmlsZSBjcmVhdGlvbiBwYWdlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbXJlbE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBuZXdGaWxlQ3JlYXRpb25QYWdlOw0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgaW5pdGlhbCBvYmplY3QgY3JlYXRpb24gcGFnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb21yZWxNb2RlbFdpemFyZEluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZTsNCisNCisJLyoqDQorCSAqIFJlbWVtYmVyIHRoZSBzZWxlY3Rpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIGZvciBwb3B1bGF0aW5nIHRoZSBkZWZhdWx0IGNvbnRhaW5lci4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247DQorDQorCS8qKg0KKwkgKiBSZW1lbWJlciB0aGUgd29ya2JlbmNoIGR1cmluZyBpbml0aWFsaXphdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBJV29ya2JlbmNoIHdvcmtiZW5jaDsNCisNCisJLyoqDQorCSAqIENhY2hlcyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgYXMgdGhlIHJvb3Qgb2JqZWN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBpbml0aWFsT2JqZWN0TmFtZXM7DQorDQorCS8qKg0KKwkgKiBUaGlzIGp1c3QgcmVjb3JkcyB0aGUgaW5mb3JtYXRpb24uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCisJCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOw0KKwkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247DQorCQlzZXRXaW5kb3dUaXRsZShDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2xhYmVsIikpOw0KKwkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LklOU1RBTkNFLmdldEltYWdlRGVzY3JpcHRvcihDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvd2l6YmFuL05ld0NvbXJlbCIpKSk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGFzIHRoZSByb290IG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkgew0KKwkJaWYgKGluaXRpYWxPYmplY3ROYW1lcyA9PSBudWxsKSB7DQorCQkJaW5pdGlhbE9iamVjdE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorCQkJZm9yIChFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA6IGNvbXJlbFBhY2thZ2UuZ2V0RUNsYXNzaWZpZXJzKCkpIHsNCisJCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7DQorCQkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcyllQ2xhc3NpZmllcjsNCisJCQkJCWlmICghZUNsYXNzLmlzQWJzdHJhY3QoKSkgew0KKwkJCQkJCWluaXRpYWxPYmplY3ROYW1lcy5hZGQoZUNsYXNzLmdldE5hbWUoKSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJQ29sbGVjdGlvbnMuc29ydChpbml0aWFsT2JqZWN0TmFtZXMsIENvbW1vblBsdWdpbi5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCkpOw0KKwkJfQ0KKwkJcmV0dXJuIGluaXRpYWxPYmplY3ROYW1lczsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlIGEgbmV3IG1vZGVsLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlSW5pdGlhbE1vZGVsKCkgew0KKwkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpY29tcmVsUGFja2FnZS5nZXRFQ2xhc3NpZmllcihpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlLmdldEluaXRpYWxPYmplY3ROYW1lKCkpOw0KKwkJRU9iamVjdCByb290T2JqZWN0ID0gY29tcmVsRmFjdG9yeS5jcmVhdGUoZUNsYXNzKTsNCisJCXJldHVybiByb290T2JqZWN0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBEbyB0aGUgd29yayBhZnRlciBldmVyeXRoaW5nIGlzIHNwZWNpZmllZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgew0KKwkJdHJ5IHsNCisJCQkvLyBSZW1lbWJlciB0aGUgZmlsZS4NCisJCQkvLw0KKwkJCWZpbmFsIElGaWxlIG1vZGVsRmlsZSA9IGdldE1vZGVsRmlsZSgpOw0KKw0KKwkJCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24uDQorCQkJLy8NCisJCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0NCisJCQkJbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQkJCUBPdmVycmlkZQ0KKwkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KKwkJCQkJCXRyeSB7DQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldA0KKwkJCQkJCQkvLw0KKwkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisNCisJCQkJCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7DQorDQorCQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuDQorCQkJCQkJCS8vDQorCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoZmlsZVVSSSk7DQorDQorCQkJCQkJCS8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLg0KKwkJCQkJCQkvLw0KKwkJCQkJCQlFT2JqZWN0IHJvb3RPYmplY3QgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsNCisJCQkJCQkJaWYgKHJvb3RPYmplY3QgIT0gbnVsbCkgew0KKwkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdE9iamVjdCk7DQorCQkJCQkJCX0NCisNCisJCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlIHN5c3RlbS4NCisJCQkJCQkJLy8NCisJCQkJCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQorCQkJCQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5nZXRFbmNvZGluZygpKTsNCisJCQkJCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsNCisJCQkJCQl9DQorCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisJCQkJCQkJQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCQkJCX0NCisJCQkJCQlmaW5hbGx5IHsNCisJCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX07DQorDQorCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCBmYWxzZSwgb3BlcmF0aW9uKTsNCisNCisJCQkvLyBTZWxlY3QgdGhlIG5ldyBmaWxlIHJlc291cmNlIGluIHRoZSBjdXJyZW50IHZpZXcuDQorCQkJLy8NCisJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsNCisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsNCisJCQlmaW5hbCBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7DQorCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7DQorCQkJCWZpbmFsIElTZWxlY3Rpb24gdGFyZ2V0U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWxGaWxlKTsNCisJCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjDQorCQkJCQkobmV3IFJ1bm5hYmxlKCkgew0KKwkJCQkJCSBwdWJsaWMgdm9pZCBydW4oKSB7DQorCQkJCQkJCSAoKElTZXRTZWxlY3Rpb25UYXJnZXQpYWN0aXZlUGFydCkuc2VsZWN0UmV2ZWFsKHRhcmdldFNlbGVjdGlvbik7DQorCQkJCQkJIH0NCisJCQkJCSB9KTsNCisJCQl9DQorDQorCQkJLy8gT3BlbiBhbiBlZGl0b3Igb24gdGhlIG5ldyBmaWxlLg0KKwkJCS8vDQorCQkJdHJ5IHsNCisJCQkJcGFnZS5vcGVuRWRpdG9yDQorCQkJCQkobmV3IEZpbGVFZGl0b3JJbnB1dChtb2RlbEZpbGUpLA0KKwkJCQkJIHdvcmtiZW5jaC5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IobW9kZWxGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkuZ2V0SWQoKSk7CQkJCQkgCSANCisJCQl9DQorCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbCIpLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQorCQkJQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogVGhpcyBpcyB0aGUgb25lIHBhZ2Ugb2YgdGhlIHdpemFyZC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBjbGFzcyBDb21yZWxNb2RlbFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsNCisJCS8qKg0KKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgQ29tcmVsTW9kZWxXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKFN0cmluZyBwYWdlSWQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KKwkJCXN1cGVyKHBhZ2VJZCwgc2VsZWN0aW9uKTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBjb3JyZWN0Lg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlAT3ZlcnJpZGUNCisJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsNCisJCQlpZiAoc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsNCisJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKTsNCisJCQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsIHx8ICFGSUxFX0VYVEVOU0lPTlMuY29udGFpbnMoZXh0ZW5zaW9uKSkgew0KKwkJCQkJU3RyaW5nIGtleSA9IEZJTEVfRVhURU5TSU9OUy5zaXplKCkgPiAxID8gIl9XQVJOX0ZpbGVuYW1lRXh0ZW5zaW9ucyIgOiAiX1dBUk5fRmlsZW5hbWVFeHRlbnNpb24iOw0KKwkJCQkJc2V0RXJyb3JNZXNzYWdlKENvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0IFtdIHsgRk9STUFUVEVEX0ZJTEVfRVhURU5TSU9OUyB9KSk7DQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCX0NCisJCQkJcmV0dXJuIHRydWU7DQorCQkJfQ0KKwkJCXJldHVybiBmYWxzZTsNCisJCX0NCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5hcHBlbmQoZ2V0RmlsZU5hbWUoKSkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGlzIGlzIHRoZSBwYWdlIHdoZXJlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBjcmVhdGUgaXMgc2VsZWN0ZWQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgY2xhc3MgQ29tcmVsTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7DQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbWJvIGluaXRpYWxPYmplY3RGaWVsZDsNCisNCisJCS8qKg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICovDQorCQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGVuY29kaW5nczsNCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdGaWVsZDsNCisNCisJCS8qKg0KKwkJICogUGFzcyBpbiB0aGUgc2VsZWN0aW9uLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwdWJsaWMgQ29tcmVsTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKFN0cmluZyBwYWdlSWQpIHsNCisJCQlzdXBlcihwYWdlSWQpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KKwkJCXsNCisJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KKwkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7DQorCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMjsNCisJCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOw0KKw0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKw0KKwkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOw0KKwkJCXsNCisJCQkJY29udGFpbmVyTGFiZWwuc2V0VGV4dChDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfTW9kZWxPYmplY3QiKSk7DQorDQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJY29udGFpbmVyTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsNCisJCQl9DQorDQorCQkJaW5pdGlhbE9iamVjdEZpZWxkID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7DQorCQkJew0KKwkJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7DQorCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQorCQkJCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7DQorCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlmb3IgKFN0cmluZyBvYmplY3ROYW1lIDogZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkpIHsNCisJCQkJaW5pdGlhbE9iamVjdEZpZWxkLmFkZChnZXRMYWJlbChvYmplY3ROYW1lKSk7DQorCQkJfQ0KKw0KKwkJCWlmIChpbml0aWFsT2JqZWN0RmllbGQuZ2V0SXRlbUNvdW50KCkgPT0gMSkgew0KKwkJCQlpbml0aWFsT2JqZWN0RmllbGQuc2VsZWN0KDApOw0KKwkJCX0NCisJCQlpbml0aWFsT2JqZWN0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodmFsaWRhdG9yKTsNCisNCisJCQlMYWJlbCBlbmNvZGluZ0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOw0KKwkJCXsNCisJCQkJZW5jb2RpbmdMYWJlbC5zZXRUZXh0KENvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZyIpKTsNCisNCisJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KKwkJCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KKwkJCQllbmNvZGluZ0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7DQorCQkJfQ0KKwkJCWVuY29kaW5nRmllbGQgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSKTsNCisJCQl7DQorCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsNCisJCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCisJCQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCisJCQkJZW5jb2RpbmdGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOw0KKwkJCX0NCisNCisJCQlmb3IgKFN0cmluZyBlbmNvZGluZyA6IGdldEVuY29kaW5ncygpKSB7DQorCQkJCWVuY29kaW5nRmllbGQuYWRkKGVuY29kaW5nKTsNCisJCQl9DQorDQorCQkJZW5jb2RpbmdGaWVsZC5zZWxlY3QoMCk7DQorCQkJZW5jb2RpbmdGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih2YWxpZGF0b3IpOw0KKw0KKwkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7DQorCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciB2YWxpZGF0b3IgPQ0KKwkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsNCisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7DQorCQkJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOw0KKwkJCQl9DQorCQkJfTsNCisNCisJCS8qKg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7DQorCQkJcmV0dXJuIGdldEluaXRpYWxPYmplY3ROYW1lKCkgIT0gbnVsbCAmJiBnZXRFbmNvZGluZ3MoKS5jb250YWlucyhlbmNvZGluZ0ZpZWxkLmdldFRleHQoKSk7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJQE92ZXJyaWRlDQorCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgew0KKwkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7DQorCQkJaWYgKHZpc2libGUpIHsNCisJCQkJaWYgKGluaXRpYWxPYmplY3RGaWVsZC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7DQorCQkJCQlpbml0aWFsT2JqZWN0RmllbGQuY2xlYXJTZWxlY3Rpb24oKTsNCisJCQkJCWVuY29kaW5nRmllbGQuc2V0Rm9jdXMoKTsNCisJCQkJfQ0KKwkJCQllbHNlIHsNCisJCQkJCWVuY29kaW5nRmllbGQuY2xlYXJTZWxlY3Rpb24oKTsNCisJCQkJCWluaXRpYWxPYmplY3RGaWVsZC5zZXRGb2N1cygpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbE9iamVjdE5hbWUoKSB7DQorCQkJU3RyaW5nIGxhYmVsID0gaW5pdGlhbE9iamVjdEZpZWxkLmdldFRleHQoKTsNCisNCisJCQlmb3IgKFN0cmluZyBuYW1lIDogZ2V0SW5pdGlhbE9iamVjdE5hbWVzKCkpIHsNCisJCQkJaWYgKGdldExhYmVsKG5hbWUpLmVxdWFscyhsYWJlbCkpIHsNCisJCQkJCXJldHVybiBuYW1lOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiBudWxsOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7DQorCQkJcmV0dXJuIGVuY29kaW5nRmllbGQuZ2V0VGV4dCgpOw0KKwkJfQ0KKw0KKwkJLyoqDQorCQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoU3RyaW5nIHR5cGVOYW1lKSB7DQorCQkJdHJ5IHsNCisJCQkJcmV0dXJuIENvbXJlbEVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7DQorCQkJfQ0KKwkJCWNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsNCisJCQkJQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhtcmUpOw0KKwkJCX0NCisJCQlyZXR1cm4gdHlwZU5hbWU7DQorCQl9DQorDQorCQkvKioNCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRFbmNvZGluZ3MoKSB7DQorCQkJaWYgKGVuY29kaW5ncyA9PSBudWxsKSB7DQorCQkJCWVuY29kaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKwkJCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKENvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9YTUxFbmNvZGluZ0Nob2ljZXMiKSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgew0KKwkJCQkJZW5jb2RpbmdzLmFkZChzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCkpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXJldHVybiBlbmNvZGluZ3M7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFRoZSBmcmFtZXdvcmsgY2FsbHMgdGhpcyB0byBjcmVhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aXphcmQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwkJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgew0KKwkJLy8gQ3JlYXRlIGEgcGFnZSwgc2V0IHRoZSB0aXRsZSwgYW5kIHRoZSBpbml0aWFsIG1vZGVsIGZpbGUgbmFtZS4NCisJCS8vDQorCQluZXdGaWxlQ3JlYXRpb25QYWdlID0gbmV3IENvbXJlbE1vZGVsV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSgiV2hhdGV2ZXIiLCBzZWxlY3Rpb24pOw0KKwkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRUaXRsZShDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29tcmVsTW9kZWxXaXphcmRfbGFiZWwiKSk7DQorCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldERlc2NyaXB0aW9uKENvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db21yZWxNb2RlbFdpemFyZF9kZXNjcmlwdGlvbiIpKTsNCisJCW5ld0ZpbGVDcmVhdGlvblBhZ2Uuc2V0RmlsZU5hbWUoQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbXJlbEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2UiKSArICIuIiArIEZJTEVfRVhURU5TSU9OUy5nZXQoMCkpOw0KKwkJYWRkUGFnZShuZXdGaWxlQ3JlYXRpb25QYWdlKTsNCisNCisJCS8vIFRyeSBhbmQgZ2V0IHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIGEgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGRpYWxvZy4NCisJCS8vDQorCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCisJCQkvLyBHZXQgdGhlIHJlc291cmNlLi4uDQorCQkJLy8NCisJCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOw0KKwkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsNCisJCQkJLy8gR2V0IHRoZSByZXNvdXJjZSBwYXJlbnQsIGlmIGl0cyBhIGZpbGUuDQorCQkJCS8vDQorCQkJCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSlzZWxlY3RlZEVsZW1lbnQ7DQorCQkJCWlmIChzZWxlY3RlZFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgew0KKwkJCQkJc2VsZWN0ZWRSZXNvdXJjZSA9IHNlbGVjdGVkUmVzb3VyY2UuZ2V0UGFyZW50KCk7DQorCQkJCX0NCisNCisJCQkJLy8gVGhpcyBnaXZlcyB1cyBhIGRpcmVjdG9yeS4uLg0KKwkJCQkvLw0KKwkJCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIgfHwgc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7DQorCQkJCQkvLyBTZXQgdGhpcyBmb3IgdGhlIGNvbnRhaW5lci4NCisJCQkJCS8vDQorCQkJCQluZXdGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKHNlbGVjdGVkUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7DQorDQorCQkJCQkvLyBNYWtlIHVwIGEgdW5pcXVlIG5ldyBuYW1lIGhlcmUuDQorCQkJCQkvLw0KKwkJCQkJU3RyaW5nIGRlZmF1bHRNb2RlbEJhc2VGaWxlbmFtZSA9IENvbXJlbEVkaXRvclBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db21yZWxFZGl0b3JGaWxlbmFtZURlZmF1bHRCYXNlIik7DQorCQkJCQlTdHJpbmcgZGVmYXVsdE1vZGVsRmlsZW5hbWVFeHRlbnNpb24gPSBGSUxFX0VYVEVOU0lPTlMuZ2V0KDApOw0KKwkJCQkJU3RyaW5nIG1vZGVsRmlsZW5hbWUgPSBkZWZhdWx0TW9kZWxCYXNlRmlsZW5hbWUgKyAiLiIgKyBkZWZhdWx0TW9kZWxGaWxlbmFtZUV4dGVuc2lvbjsNCisJCQkJCWZvciAoaW50IGkgPSAxOyAoKElDb250YWluZXIpc2VsZWN0ZWRSZXNvdXJjZSkuZmluZE1lbWJlcihtb2RlbEZpbGVuYW1lKSAhPSBudWxsOyArK2kpIHsNCisJCQkJCQltb2RlbEZpbGVuYW1lID0gZGVmYXVsdE1vZGVsQmFzZUZpbGVuYW1lICsgaSArICIuIiArIGRlZmF1bHRNb2RlbEZpbGVuYW1lRXh0ZW5zaW9uOw0KKwkJCQkJfQ0KKwkJCQkJbmV3RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShtb2RlbEZpbGVuYW1lKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2UgPSBuZXcgQ29tcmVsTW9kZWxXaXphcmRJbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKCJXaGF0ZXZlcjIiKTsNCisJCWluaXRpYWxPYmplY3RDcmVhdGlvblBhZ2Uuc2V0VGl0bGUoQ29tcmVsRWRpdG9yUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbXJlbE1vZGVsV2l6YXJkX2xhYmVsIikpOw0KKwkJaW5pdGlhbE9iamVjdENyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihDb21yZWxFZGl0b3JQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV2l6YXJkX2luaXRpYWxfb2JqZWN0X2Rlc2NyaXB0aW9uIikpOw0KKwkJYWRkUGFnZShpbml0aWFsT2JqZWN0Q3JlYXRpb25QYWdlKTsNCisJfQ0KKw0KKwkvKioNCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgSUZpbGUgZ2V0TW9kZWxGaWxlKCkgew0KKwkJcmV0dXJuIG5ld0ZpbGVDcmVhdGlvblBhZ2UuZ2V0TW9kZWxGaWxlKCk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4ZjE2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSmF2YVNFLTEuNiIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KKzwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhN2M3MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHByb2plY3REZXNjcmlwdGlvbj4NCisJPG5hbWU+b3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3I8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPHByb2plY3RzPg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNWUwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDggQEAKKyNXZWQgU2VwIDIxIDExOjE4OjEyIENFU1QgMjAxMQ0KK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS42DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ1NmNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxNiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogQ29NUmVMIEdlbmVyYXRvcgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3I7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMC45LjAKK0J1bmRsZS1BY3RpdmF0b3I6IGNvbXJlbC5nZW5lcmF0b3IuQWN0aXZhdG9yCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSIzLjYuMCIsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjYuMSIsCisgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW47YnVuZGxlLXZlcnNpb249IjIuNi4wIiwKKyBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iMy42LjEiLAorIG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWw7YnVuZGxlLXZlcnNpb249IjAuOC4wIgorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS42CitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudWkuYWN0aW9ucwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvYmluLy5naXRpZ25vcmUgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9iaW4vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhkYmNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvYmluLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorL2NvbXJlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlZDM2YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw5IEBACitzb3VyY2UuLiA9IHNyYy8NCitvdXRwdXQuLiA9IGJpbi8NCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KKyAgICAgICAgICAgICAgIC4sXA0KKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KKyAgICAgICAgICAgICAgIGljb25zLyxcDQorICAgICAgICAgICAgICAgc3JjLyxcDQorICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcDQorICAgICAgICAgICAgICAgYmluLw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL211bHRpZmVhdHVyZS5qcGcgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9pY29ucy9tdWx0aWZlYXR1cmUuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjZlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9pY29ucy9tdWx0aWZlYXR1cmUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL211bHRpZmlsdGVyLmpwZyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL211bHRpZmlsdGVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQxMWQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvaWNvbnMvbXVsdGlmaWx0ZXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL3JlZmFjdG9yaW5nLmpwZyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL3JlZmFjdG9yaW5nLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI3N2VlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvaWNvbnMvcmVmYWN0b3JpbmcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL3NpbmdsZWZlYXR1cmUuZ2lmIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvaWNvbnMvc2luZ2xlZmVhdHVyZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyOTRhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL3NpbmdsZWZlYXR1cmUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL2ljb25zL3NpbmdsZWZpbHRlci5wbmcgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9pY29ucy9zaW5nbGVmaWx0ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmMzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9pY29ucy9zaW5nbGVmaWx0ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjdkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/Pg0KKzxwbHVnaW4+DQorICAgPGV4dGVuc2lvbg0KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4NCisgICAgICA8Y2F0ZWdvcnkNCisgICAgICAgICAgICBpZD0iY29tcmVsLmdlbmVyYXRvci5jYXRlZ29yeSINCisgICAgICAgICAgICBuYW1lPSJDb01SZUwiDQorICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5uZXd3aXphcmRzLmNhdGVnb3J5Ij4NCisgICAgICA8L2NhdGVnb3J5Pg0KKyAgICAgIDx3aXphcmQNCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm5ld3dpemFyZHMuY2F0ZWdvcnkvY29tcmVsLmdlbmVyYXRvci5jYXRlZ29yeSINCisgICAgICAgICAgICBjbGFzcz0iY29tcmVsLmdlbmVyYXRvci5oZWxwZXIud2l6YXJkcy5TaW5nbGVGaWx0ZXJXaXphcmQiDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2luZ2xlZmlsdGVyLnBuZyINCisgICAgICAgICAgICBpZD0iY29tcmVsLmdlbmVyYXRvci53aXphcmQuc2luZ2xlZmlsdGVyIg0KKyAgICAgICAgICAgIG5hbWU9IlNpbmdsZSBGaWx0ZXIiPg0KKyAgICAgIDwvd2l6YXJkPg0KKyAgICAgIDx3aXphcmQNCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm5ld3dpemFyZHMuY2F0ZWdvcnkvY29tcmVsLmdlbmVyYXRvci5jYXRlZ29yeSINCisgICAgICAgICAgICBjbGFzcz0iY29tcmVsLmdlbmVyYXRvci5oZWxwZXIud2l6YXJkcy5NdWx0aUZpbHRlcldpemFyZCINCisgICAgICAgICAgICBpY29uPSJpY29ucy9tdWx0aWZpbHRlci5qcGciDQorICAgICAgICAgICAgaWQ9ImNvbXJlbC5nZW5lcmF0b3Iud2l6YXJkLm11bHRpZmlsdGVyIg0KKyAgICAgICAgICAgIG5hbWU9Ik11bHRpIEZpbHRlciI+DQorICAgICAgPC93aXphcmQ+DQorICAgICAgPHdpemFyZA0KKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubmV3d2l6YXJkcy5jYXRlZ29yeS9jb21yZWwuZ2VuZXJhdG9yLmNhdGVnb3J5Ig0KKyAgICAgICAgICAgIGNsYXNzPSJjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci53aXphcmRzLlNpbmdsZUZlYXR1cmVXaXphcmQiDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2luZ2xlZmVhdHVyZS5naWYiDQorICAgICAgICAgICAgaWQ9ImNvbXJlbC5nZW5lcmF0b3Iud2l6YXJkLnNpbmdsZWZlYXR1cmUiDQorICAgICAgICAgICAgbmFtZT0iU2luZ2xlIEZlYXR1cmUiPg0KKyAgICAgIDwvd2l6YXJkPg0KKyAgICAgIDx3aXphcmQNCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm5ld3dpemFyZHMuY2F0ZWdvcnkvY29tcmVsLmdlbmVyYXRvci5jYXRlZ29yeSINCisgICAgICAgICAgICBjbGFzcz0iY29tcmVsLmdlbmVyYXRvci5oZWxwZXIud2l6YXJkcy5NdWx0aUZlYXR1cmVXaXphcmQiDQorICAgICAgICAgICAgaWNvbj0iaWNvbnMvbXVsdGlmZWF0dXJlLmpwZyINCisgICAgICAgICAgICBpZD0iY29tcmVsLmdlbmVyYXRvci53aXphcmQubXVsdGlmZWF0dXJlIg0KKyAgICAgICAgICAgIG5hbWU9Ik11bHRpIEZlYXR1cmUiPg0KKyAgICAgIDwvd2l6YXJkPg0KKyAgICAgIDx3aXphcmQNCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm5ld3dpemFyZHMuY2F0ZWdvcnkvY29tcmVsLmdlbmVyYXRvci5jYXRlZ29yeSINCisgICAgICAgICAgICBjbGFzcz0iY29tcmVsLmdlbmVyYXRvci5yZWZhY3RvcmluZy53aXphcmRzLlJlZmFjdG9yaW5nV2l6YXJkIg0KKyAgICAgICAgICAgIGljb249Imljb25zL3JlZmFjdG9yaW5nLmpwZyINCisgICAgICAgICAgICBpZD0iY29tcmVsLmdlbmVyYXRvci53aXphcmQucmVmYWN0b3JpbmciDQorICAgICAgICAgICAgbmFtZT0iUmVmYWN0b3JpbmcgKHNwZWNpZmllZCBpbiBDb01SZUwpIj4NCisgICAgICA8L3dpemFyZD4NCisgICA8L2V4dGVuc2lvbj4NCisNCis8L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9BY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OGU5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9BY3RpdmF0b3IuamF2YQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIGNvbXJlbC5nZW5lcmF0b3I7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCisNCisvKioNCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCisgKi8NCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7DQorDQorCS8vIFRoZSBwbHVnLWluIElEDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvciI7IC8vJE5PTi1OTFMtMSQNCisNCisJLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KKwlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOw0KKwkNCisJLyoqDQorCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KKwkgKi8NCisJcHVibGljIEFjdGl2YXRvcigpIHsNCisJfQ0KKw0KKwkvKg0KKwkgKiAobm9uLUphdmFkb2MpDQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQorCQlwbHVnaW4gPSB0aGlzOw0KKwl9DQorDQorCS8qDQorCSAqIChub24tSmF2YWRvYykNCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KKwkgKi8NCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KKwkJcGx1Z2luID0gbnVsbDsNCisJCXN1cGVyLnN0b3AoY29udGV4dCk7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KKwkgKg0KKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7DQorCQlyZXR1cm4gcGx1Z2luOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9FeHRlbnNpb25Qb2ludC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL0V4dGVuc2lvblBvaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmNzk5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9FeHRlbnNpb25Qb2ludC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UgY29tcmVsLmdlbmVyYXRvci5oZWxwZXI7DQorDQorcHVibGljIGNsYXNzIEV4dGVuc2lvblBvaW50IHsNCisJDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9UQUcgPSAiZXh0ZW5zaW9uIjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VVUkkgPSAibmFtZXNwYWNlVXJpIjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICJjbGFzcyI7DQorCQ0KKy8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9NVUxUSUZFQVRVUkUgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm11bHRpZmVhdHVyZSI7DQorLy8JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTVVMVElGRUFUVVJFID0gIm11bHRpZmVhdHVyZSI7DQorLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX1NJTkdMRUZFQVRVUkUgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnNpbmdsZWZlYXR1cmUiOw0KKy8vCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNJTkdMRUZFQVRVUkUgPSAic2luZ2xlZmVhdHVyZSI7DQorLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX01VTFRJRklMVEVSID0gIm9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5tdWx0aWZpbHRlciI7DQorLy8JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTVVMVElGSUxURVIgPSAibXVsdGlmaWx0ZXIiOw0KKy8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9TSU5HTEVGSUxURVIgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnNpbmdsZWZpbHRlciI7DQorLy8JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0lOR0xFRklMVEVSID0gInNpbmdsZWZpbHRlciI7DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9IZWxwZXJHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9IZWxwZXJHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjc5ODExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL0hlbHBlckdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACitwYWNrYWdlIGNvbXJlbC5nZW5lcmF0b3IuaGVscGVyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7DQoraW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5qZXQuSkVURW1pdHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4udXRpbC5Db2RlR2VuVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsNCisNCitpbXBvcnQgY29tcmVsLmdlbmVyYXRvci5BY3RpdmF0b3I7DQorDQorcHVibGljIGNsYXNzIEhlbHBlckdlbmVyYXRvciB7DQorCQ0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBKRVRFTUlUVEVSUyA9ICIuSkVURW1pdHRlcnMiOw0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBKQVZBID0gIi5qYXZhIjsNCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSkFWQUpFVCA9ICIuamF2YWpldCI7DQorCXByaXZhdGUgZmluYWwgU3RyaW5nIENPTVJFTE1PREVMID0gImNvbXJlbCI7DQorCXByaXZhdGUgZmluYWwgU3RyaW5nIFJFUVVJUkVCVU5ETEUgPSAiUmVxdWlyZS1CdW5kbGUiOw0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBCVU5ETEVTWU1CT0xJQ05BTUUgPSAiQnVuZGxlLVN5bWJvbGljTmFtZSI7DQorCXByaXZhdGUgZmluYWwgU3RyaW5nIEJVTkRMRVZFUlNJT04gPSAiQnVuZGxlLVZlcnNpb24iOw0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBTSU5HTEVUT05UUlVFID0gInNpbmdsZXRvbjo9dHJ1ZSI7CQ0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBURU1QTEFURVMgPSAidGVtcGxhdGVzIjsNCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOU1BBVEggPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCkgKyAicGx1Z2lucy8iOw0KKwkNCisJcHJpdmF0ZSBIZWxwZXJJbmZvIGhlbHBlckluZm87DQorCXByaXZhdGUgU3RyaW5nIHRlbXBsYXRlRGlyZWN0b3J5Ow0KKwlwcml2YXRlIEpFVEVtaXR0ZXIgamV0RW1pdHRlcjsNCisJcHJpdmF0ZSBMaXN0PElDbGFzc3BhdGhFbnRyeT4gY2xhc3NwYXRoRW50cmllczsgDQorCQ0KKwkNCisJcHVibGljIEhlbHBlckdlbmVyYXRvcihIZWxwZXJJbmZvIGhlbHBlckluZm8pIHsNCisJCXRoaXMuaGVscGVySW5mbyA9IGhlbHBlckluZm87DQorCQl0aGlzLnRlbXBsYXRlRGlyZWN0b3J5ID0gdGhpcy5zZXRUZW1wbGF0ZURpcmVjdG9yeSgpOw0KKwkJdGhpcy5jbGFzc3BhdGhFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7DQorCQl0aGlzLnNldENsYXNzUGF0aEVudHJpZXMoKTsNCisJfQ0KKwkNCisJcHJpdmF0ZSB2b2lkIHNldENsYXNzUGF0aEVudHJpZXMoKSB7DQorCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEFjdGl2YXRvci5QTFVHSU5fSUQpOw0KKwkJU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSBidW5kbGUuZ2V0SGVhZGVycygpLmdldChCVU5ETEVWRVJTSU9OKTsNCisJCWNsYXNzcGF0aEVudHJpZXMuYWRkKEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChQTFVHSU5TUEFUSA0KKwkJCQkrIEFjdGl2YXRvci5QTFVHSU5fSUQgKyAiXyIgKyB2ZXJzaW9uICsgIi5qYXIiKSwgbnVsbCwgbnVsbCkpOw0KKwl9DQorCQ0KKwlwcml2YXRlIFN0cmluZyBzZXRUZW1wbGF0ZURpcmVjdG9yeSgpIHsNCisJCVN0cmluZyB0ZCA9ICIiOw0KKwkJZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShBY3RpdmF0b3IuUExVR0lOX0lEKTsNCisJCXRyeSB7DQorCQkJdGQgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoYnVuZGxlLmdldEVudHJ5KFRFTVBMQVRFUykpLmdldEZpbGUoKTsNCisJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwkJcmV0dXJuIHRkOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgaGVscGVyVHlwZSwgU3RyaW5nIGhlbHBlckV4dGVuc2lvblBvaW50KSB7DQorCQlkZWxldGVKZXRFbWl0dGVyc1Byb2plY3QobW9uaXRvcik7DQorCQl1cGRhdGVQbHVnaW5YbWwoaGVscGVyVHlwZSwgaGVscGVyRXh0ZW5zaW9uUG9pbnQpOw0KKwkJdXBkYXRlRGVwZW5kZW5jaWVzKCk7DQorCQlzZXRTaW5nbGV0b25EaXJlY3RpdmUoKTsNCisJCWdlbmVyYXRlSmF2YUNvZGUobW9uaXRvciwgaGVscGVyVHlwZSk7DQorCQlyZWZyZXNoUHJvamVjdChtb25pdG9yKTsNCisJfQ0KKwkNCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSmF2YUNvZGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgaGVscGVyVHlwZSkgew0KKwkJU3RyaW5nIGdlbmVyYXRlZENvZGUgPSAiIjsNCisJCXRyeSB7DQorCQkJZ2VuZXJhdGVkQ29kZSA9IHRoaXMuZ2VuZXJhdGVDb2RlKG1vbml0b3IsIGhlbHBlclR5cGUpOw0KKwkJCXRoaXMuc2F2ZShtb25pdG9yLCBnZW5lcmF0ZWRDb2RlLCBoZWxwZXJJbmZvLmdldENsYXNzTmFtZSgpKTsNCisJCX0gY2F0Y2ggKEpFVEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisJDQorCXByaXZhdGUgSUNvbnRhaW5lciBmaW5kT3JDcmVhdGVQYWNrYWdlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQlJUGF0aCBvdXRwdXRQYXRoID0gbmV3IFBhdGgodGhpcy5oZWxwZXJJbmZvLmdldFByb2plY3ROYW1lKCkgKyAiL3NyYy8iICsgdGhpcy5oZWxwZXJJbmZvLmdldFBhY2thZ2VOYW1lKCkucmVwbGFjZSgnLicsICcvJykpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJvdXRwdXRwYXRoOiAiICsgb3V0cHV0UGF0aC50b1N0cmluZygpKTsNCisJCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKTsNCisJCUlQYXRoIGxvY2FsTG9jYXRpb24gPSBudWxsOyANCisJCUlDb250YWluZXIgY29udGFpbmVyID0gQ29kZUdlblV0aWwuRWNsaXBzZVV0aWwuZmluZE9yQ3JlYXRlQ29udGFpbmVyKG91dHB1dFBhdGgsIHRydWUsIGxvY2FsTG9jYXRpb24sIHN1Yk1vbml0b3IpOw0KKwkJcmV0dXJuIGNvbnRhaW5lcjsNCisJfQ0KKwkNCisJcHJpdmF0ZSB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgY29udGVudCwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSkVURXhjZXB0aW9uIHsNCisJCUlDb250YWluZXIgY29udGFpbmVyID0gZmluZE9yQ3JlYXRlUGFja2FnZShtb25pdG9yKTsNCisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgew0KKwkJCXRocm93IG5ldyBKRVRFeGNlcHRpb24NCisJCQkJKCJDb3VuZCBub3QgZmluZCBvciBjcmVhdGUgY29udGFpbmVyIGZvciBwYWNrYWdlICIgDQorCQkJCQkJCQkrIHRoaXMuaGVscGVySW5mby5nZXRQYWNrYWdlTmFtZSgpICsgIiBpbiAiIA0KKwkJCQkJCQkJKyB0aGlzLmhlbHBlckluZm8uZ2V0UHJvamVjdE5hbWUoKSk7DQorCQl9DQorCQlJRmlsZSBmaWxlID0gY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoZmlsZU5hbWUgKyBKQVZBKSk7DQorCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50LmdldEJ5dGVzKCkpOw0KKwkJaWYgKCFmaWxlLmV4aXN0cygpKSB7DQorCQkJZmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIGZhbHNlLCBtb25pdG9yKTsNCisJCX0gZWxzZSB7DQorCQkJY29udGFpbmVyLnJlZnJlc2hMb2NhbCgxLCBtb25pdG9yKTsNCisJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbW9uaXRvcik7DQorCQl9DQorCX0NCisJDQorCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29kZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZW1wbGF0ZSkgew0KKwkJU3RyaW5nIHRlbXBsYXRlUGF0aCA9IHRoaXMudGVtcGxhdGVEaXJlY3RvcnkgKyB0ZW1wbGF0ZSArIEpBVkFKRVQ7DQorCQlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsNCisJCXRoaXMuamV0RW1pdHRlciA9IG5ldyBKRVRFbWl0dGVyKHRlbXBsYXRlUGF0aCwgY2xhc3NMb2FkZXIpOw0KKwkJdGhpcy5qZXRFbWl0dGVyLmdldENsYXNzcGF0aEVudHJpZXMoKS5hZGRBbGwoY2xhc3NwYXRoRW50cmllcyk7DQorCQlTdHJpbmcgcmVzdWx0ID0gIiI7DQorCQlJUHJvZ3Jlc3NNb25pdG9yIHN1YiA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSk7DQorCQl0cnkgew0KKwkJCXJlc3VsdCA9IGpldEVtaXR0ZXIuZ2VuZXJhdGUoc3ViLCBuZXcgT2JqZWN0W10geyB0aGlzLmhlbHBlckluZm8gfSk7DQorCQl9IGNhdGNoIChKRVRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCXByaXZhdGUgdm9pZCB1cGRhdGVQbHVnaW5YbWwoU3RyaW5nIGhlbHBlclR5cGUsIFN0cmluZyBoZWxwZXJFeHRlbnNpb25Qb2ludCkgew0KKwkJWE1MUGx1Z2luRmlsZS5jcmVhdGVIZWxwZXJFbnRyeShoZWxwZXJJbmZvLCBoZWxwZXJUeXBlLCBoZWxwZXJFeHRlbnNpb25Qb2ludCk7DQorCX0NCisNCisJcHJpdmF0ZSB2b2lkIHNldFNpbmdsZXRvbkRpcmVjdGl2ZSgpIHsNCisJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodGhpcy5oZWxwZXJJbmZvLmdldFByb2plY3ROYW1lKCkpOw0KKwkJdHJ5IHsNCisJCQlTdHJpbmcgZmlsZU5hbWUgPSBwcm9qZWN0LmdldExvY2F0aW9uKCkuYXBwZW5kKCIvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKS50b09TU3RyaW5nKCk7DQorCQkJRmlsZUlucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7DQorCQkJTWFuaWZlc3QgbWYgPSBuZXcgTWFuaWZlc3QoaXMpOw0KKwkJCUF0dHJpYnV0ZXMgYXR0ID0gbWYuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsNCisJCQlTdHJpbmcgdmFsdWUgPSBhdHQuZ2V0VmFsdWUoQlVORExFU1lNQk9MSUNOQU1FKTsNCisJCQlpZiAoISB2YWx1ZS5jb250YWlucyhTSU5HTEVUT05UUlVFKSkNCisJCQkJdmFsdWUgPSB2YWx1ZSArICI7IiArICBTSU5HTEVUT05UUlVFOw0KKwkJCWF0dC5wdXRWYWx1ZShCVU5ETEVTWU1CT0xJQ05BTUUsIHZhbHVlKTsNCisJCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsgIA0KKwkJCW1mLndyaXRlKG91dCk7DQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9ICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJcHJpdmF0ZSB2b2lkIHJlZnJlc2hQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KKwkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0aGlzLmhlbHBlckluZm8uZ2V0UHJvamVjdE5hbWUoKSk7DQorCQl0cnkgew0KKwkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7DQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwl9DQorDQorCXByaXZhdGUgdm9pZCB1cGRhdGVEZXBlbmRlbmNpZXMoKSB7DQorCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRoaXMuaGVscGVySW5mby5nZXRQcm9qZWN0TmFtZSgpKTsNCisJCXRyeSB7DQorCQkJU3RyaW5nIGZpbGVOYW1lID0gcHJvamVjdC5nZXRMb2NhdGlvbigpLmFwcGVuZCgiL01FVEEtSU5GL01BTklGRVNULk1GIikudG9PU1N0cmluZygpOw0KKwkJCUZpbGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOw0KKwkJCU1hbmlmZXN0IG1mID0gbmV3IE1hbmlmZXN0KGlzKTsNCisJCQlBdHRyaWJ1dGVzIGF0dCA9IG1mLmdldE1haW5BdHRyaWJ1dGVzKCk7DQorCQkJU3RyaW5nIHZhbHVlID0gYXR0LmdldFZhbHVlKFJFUVVJUkVCVU5ETEUpOw0KKwkJCWlmICghIHZhbHVlLmNvbnRhaW5zKENPTVJFTE1PREVMKSkgDQorCQkJCXZhbHVlID0gdmFsdWUgKyAiLCIgKyAgQ09NUkVMTU9ERUw7DQorCQkJaWYgKCEgdmFsdWUuY29udGFpbnModGhpcy5oZWxwZXJJbmZvLmdldEphckZpbGUoKSkpDQorCQkJCXZhbHVlID0gdmFsdWUgKyAiLCIgKyAgdGhpcy5oZWxwZXJJbmZvLmdldEphckZpbGUoKTsNCisJCQlhdHQucHV0VmFsdWUoUkVRVUlSRUJVTkRMRSwgdmFsdWUpOw0KKwkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOyAgDQorCQkJbWYud3JpdGUob3V0KTsgDQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9ICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCX0NCisNCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUpldEVtaXR0ZXJzUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCisJCXRyeSB7DQorCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7DQorCQkJSVJlc291cmNlIHIgPSByb290LmZpbmRNZW1iZXIoSkVURU1JVFRFUlMpOw0KKwkJCWlmIChyICE9IG51bGwpew0KKwkJCQlyLmRlbGV0ZShmYWxzZSwgbW9uaXRvcik7DQorCQkJfQ0KKwkJfSANCisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgfSANCisJCWNhdGNoIChFeGNlcHRpb24gZSkgeyB9DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL0hlbHBlckluZm8uamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9IZWxwZXJJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4NzNhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9IZWxwZXJJbmZvLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKK3BhY2thZ2UgY29tcmVsLmdlbmVyYXRvci5oZWxwZXI7DQorDQorcHVibGljIGNsYXNzIEhlbHBlckluZm8gew0KKwkNCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247DQorCXByaXZhdGUgU3RyaW5nIGlkOw0KKwlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVcmk7DQorCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsNCisJcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWUgPSAiY29tcmVsLmhlbHBlciI7DQorCXByaXZhdGUgU3RyaW5nIGphckZpbGU7DQorCXByaXZhdGUgU3RyaW5nIGlucHV0VHlwZTsNCisJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0VHlwZTsNCisJcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7CQ0KKwkNCisJcHVibGljIEhlbHBlckluZm8oDQorCQkJU3RyaW5nIG5hbWUsIA0KKwkJCVN0cmluZyBkZXNjcmlwdGlvbiwgDQorCQkJU3RyaW5nIGlkLA0KKwkJCVN0cmluZyBuYW1lc3BhY2VVcmksIA0KKwkJCVN0cmluZyBjbGFzc05hbWUsDQorCQkJU3RyaW5nIGphckZpbGUsIA0KKwkJCVN0cmluZyBpbnB1dFR5cGUsIA0KKwkJCVN0cmluZyBvdXRwdXRUeXBlLA0KKwkJCVN0cmluZyBwcm9qZWN0TmFtZSkgew0KKwkJc3VwZXIoKTsNCisJCXRoaXMubmFtZSA9IG5hbWU7DQorCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQorCQl0aGlzLmlkID0gaWQ7DQorCQl0aGlzLm5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZVVyaTsNCisJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KKwkJdGhpcy5qYXJGaWxlID0gamFyRmlsZTsNCisJCXRoaXMuaW5wdXRUeXBlID0gaW5wdXRUeXBlOw0KKwkJdGhpcy5vdXRwdXRUeXBlID0gb3V0cHV0VHlwZTsNCisJCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsNCisJfQ0KKw0KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorCQlyZXR1cm4gbmFtZTsNCisJfQ0KKwkNCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCisJCXJldHVybiBkZXNjcmlwdGlvbjsNCisJfQ0KKwkNCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCisJCXJldHVybiBpZDsNCisJfQ0KKwkNCisJcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoKSB7DQorCQlyZXR1cm4gbmFtZXNwYWNlVXJpOw0KKwl9DQorCQ0KKwlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsNCisJCXJldHVybiBjbGFzc05hbWU7DQorCX0NCisJDQorCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7DQorCQlyZXR1cm4gcGFja2FnZU5hbWU7DQorCX0NCisJDQorCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgew0KKwkJcmV0dXJuIChwYWNrYWdlTmFtZSArICIuIiArIGNsYXNzTmFtZSk7DQorCX0NCisJDQorCXB1YmxpYyBTdHJpbmcgZ2V0SmFyRmlsZSgpIHsNCisJCXJldHVybiBqYXJGaWxlOw0KKwl9DQorCQ0KKwlwdWJsaWMgU3RyaW5nIGdldElucHV0VHlwZSgpIHsNCisJCXJldHVybiBpbnB1dFR5cGU7DQorCX0NCisJDQorCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSB7DQorCQlpbnQgcG9zID0gaW5wdXRUeXBlLmxhc3RJbmRleE9mKCIuIik7DQorCQlTdHJpbmcgY2wgPSBpbnB1dFR5cGUuc3Vic3RyaW5nKHBvcysxKTsNCisJCVN0cmluZyByZXQgPSBjbC5zdWJzdHJpbmcoMCwxKS50b0xvd2VyQ2FzZSgpOw0KKwkJaWYgKGNsLmxlbmd0aCgpID4gMSkgew0KKwkJCVN0cmluZyByZXN0ID0gY2wuc3Vic3RyaW5nKDEpOw0KKwkJCXJldCA9IHJldCArIHJlc3Q7DQorCQl9DQorCQlyZXQgPSByZXQgKyAiXyI7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorCQ0KKwlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFR5cGUoKSB7DQorCQlyZXR1cm4gb3V0cHV0VHlwZTsNCisJfQ0KKwkNCisJcHVibGljIFN0cmluZyBnZXRPdXRwdXRUeXBlVmFyaWFibGUoKSB7DQorCQlpbnQgcG9zID0gb3V0cHV0VHlwZS5sYXN0SW5kZXhPZigiLiIpOw0KKwkJU3RyaW5nIGNsID0gb3V0cHV0VHlwZS5zdWJzdHJpbmcocG9zKzEpOw0KKwkJU3RyaW5nIHJldCA9IGNsLnN1YnN0cmluZygwLDEpLnRvTG93ZXJDYXNlKCk7DQorCQlpZiAoY2wubGVuZ3RoKCkgPiAxKSB7DQorCQkJU3RyaW5nIHJlc3QgPSBjbC5zdWJzdHJpbmcoMSk7DQorCQkJcmV0ID0gcmV0ICsgcmVzdDsNCisJCX0NCisJCXJldCA9IHJldCArICJfIjsNCisJCXJldHVybiByZXQ7DQorCX0NCisJDQorCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7DQorCQlyZXR1cm4gcHJvamVjdE5hbWU7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlyZXR1cm4gIkhlbHBlckluZm8gW1xuIG5hbWU9IiArIG5hbWUgKyAiLCBcbiBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24NCisJCQkJKyAiLCBcbiBpZD0iICsgaWQgKyAiLCBcbiBuYW1lc3BhY2VVcmk9IiArIG5hbWVzcGFjZVVyaQ0KKwkJCQkrICIsIFxuIGNsYXNzTmFtZT0iICsgY2xhc3NOYW1lICsgIiwgXG4gcGFja2FnZU5hbWU9IiArIHBhY2thZ2VOYW1lDQorCQkJCSsgIiwgXG4gamFyRmlsZT0iICsgamFyRmlsZSArICIsIFxuIGlucHV0VHlwZT0iICsgaW5wdXRUeXBlDQorCQkJCSsgIiwgXG4gb3V0cHV0VHlwZT0iICsgb3V0cHV0VHlwZSArICIsIFxuIHByb2plY3ROYW1lPSIgKyBwcm9qZWN0TmFtZQ0KKwkJCQkrICIsIFxuIHF1YWxpZmllZENsYXNzTmFtZT0iICsgZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgKyAiXSI7DQorCX0NCisJDQorCQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvWE1MRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL1hNTEZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY1OTBlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL1hNTEZpbGUuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGNvbXJlbC5nZW5lcmF0b3IuaGVscGVyOw0KKw0KK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7DQoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7DQoraW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsNCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KKw0KK3B1YmxpYyBjbGFzcyBYTUxGaWxlIHsNCisJDQorCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNmb3JtZXIgY3JlYXRlVHJhbnNmb3JtZXIoKXsNCisJCWZpbmFsIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCisJCXRyeSB7DQorCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwieWVzIik7DQorCQkJcmV0dXJuIHRyYW5zZm9ybWVyOw0KKwkJfSBjYXRjaCAoZmluYWwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCXJldHVybiBudWxsOw0KKwkJfQkJDQorCX0NCisJCQ0KKwlwcm90ZWN0ZWQgIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgY3JlYXRlRG9jdW1lbnRCdWlsZGVyKCkgew0KKwkJdHJ5IHsNCisJCQlyZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOw0KKwkJfSBjYXRjaCAoZmluYWwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJfQ0KKwkNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL1hNTFBsdWdpbkZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9YTUxQbHVnaW5GaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2ZWE0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci9YTUxQbHVnaW5GaWxlLmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBjb21yZWwuZ2VuZXJhdG9yLmhlbHBlcjsNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247DQoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsNCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsNCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOw0KKw0KKw0KK3B1YmxpYyBjbGFzcyBYTUxQbHVnaW5GaWxlIGV4dGVuZHMgWE1MRmlsZSB7DQorCQ0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRklMRSA9ICIvcGx1Z2luLnhtbCI7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9UQUcgPSAicGx1Z2luIjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1RBRyA9ICJleHRlbnNpb24iOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0lOVF9BVFRSX1RBRyA9ICJwb2ludCI7DQorCQ0KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGVscGVyRW50cnkoSGVscGVySW5mbyBoZWxwZXJJbmZvLCBTdHJpbmcgaGVscGVyVHlwZSwgU3RyaW5nIGhlbHBlckV4dGVuc2lvblBvaW50KSB7DQorCQlmaW5hbCBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZURvY3VtZW50QnVpbGRlcigpOw0KKwkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChoZWxwZXJJbmZvLmdldFByb2plY3ROYW1lKCkpOw0KKwkJZmluYWwgU3RyaW5nIHBhdGggPSBwcm9qZWN0LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArIFBMVUdJTl9GSUxFOw0KKwkJRG9jdW1lbnQgZG9jID0gbnVsbDsNCisJCWZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOw0KKwkJaWYgKCFmaWxlLmV4aXN0cygpKQ0KKwkJCWNyZWF0ZVBsdWdpblhtbChoZWxwZXJJbmZvLmdldFByb2plY3ROYW1lKCkpOw0KKwkJaWYgKGJ1aWxkZXIgIT0gbnVsbCkgew0KKwkJCUVsZW1lbnQgcm9vdDsNCisJCQl0cnkgew0KKwkJCQlkb2MgPSBidWlsZGVyLnBhcnNlKHBhdGgpOw0KKwkJCX0gY2F0Y2ggKGZpbmFsIFNBWEV4Y2VwdGlvbiBlKSB7DQorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgew0KKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCX0NCisJCQlpZiAoZG9jICE9IG51bGwpIHsNCisJCQkJcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsNCisJCQkJRWxlbWVudCBlcCA9IGRvYy5jcmVhdGVFbGVtZW50KEVYVEVOU0lPTl9UQUcpOw0KKwkJCQllcC5zZXRBdHRyaWJ1dGUoUE9JTlRfQVRUUl9UQUcsIGhlbHBlckV4dGVuc2lvblBvaW50KTsNCisJCQkJTm9kZSBuZXdFbnRyeSA9IGNyZWF0ZUVsZW1lbnQoaGVscGVySW5mbywgZG9jLCBoZWxwZXJUeXBlKTsNCisJCQkJZXAuYXBwZW5kQ2hpbGQobmV3RW50cnkpOw0KKwkJCQlyb290LmFwcGVuZENoaWxkKGVwKTsNCisJCQl9DQorCQl9DQorCQlmaW5hbCBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGNyZWF0ZVRyYW5zZm9ybWVyKCk7DQorCQlmaW5hbCBET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOw0KKwkJZmluYWwgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQocGF0aCk7DQorCQl0cnkgew0KKwkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7DQorCQl9IGNhdGNoIChmaW5hbCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVBsdWdpblhtbChTdHJpbmcgcHJvamVjdE5hbWUpIHsNCisJCWZpbmFsIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gY3JlYXRlRG9jdW1lbnRCdWlsZGVyKCk7DQorCQlpZiAobnVsbCAhPSBidWlsZGVyKXsNCisJCQlmaW5hbCBEb2N1bWVudCBkb2MgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7CQkJDQorCQkJZmluYWwgRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoUExVR0lOX1RBRyk7DQorCQkJZG9jLmFwcGVuZENoaWxkKHJvb3QpOw0KKwkJCWZpbmFsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gY3JlYXRlVHJhbnNmb3JtZXIoKTsNCisJCQlmaW5hbCBET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOw0KKwkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOw0KKwkJCWphdmEubmV0LlVSSSB1cmkgPSBwcm9qZWN0LmdldExvY2F0aW9uVVJJKCk7DQorCQkJU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQodXJpICsgUExVR0lOX0ZJTEUpOwkJCQ0KKwkJCXRyeSB7DQorCQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7DQorCQkJfSBjYXRjaCAoZmluYWwgVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgew0KKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCX0JCQkNCisJCX0NCisJfQ0KKwkNCisJcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KEhlbHBlckluZm8gaGVscGVySW5mbywgRG9jdW1lbnQgZG9jLCBTdHJpbmcgaGVscGVyVHlwZSkgew0KKwkJZmluYWwgRWxlbWVudCBtdWx0aWZlYXR1cmUgPSBkb2MuY3JlYXRlRWxlbWVudChoZWxwZXJUeXBlKTsNCisJCW11bHRpZmVhdHVyZS5zZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uUG9pbnQuTkFNRSwgaGVscGVySW5mby5nZXROYW1lKCkpOw0KKwkJbXVsdGlmZWF0dXJlLnNldEF0dHJpYnV0ZShFeHRlbnNpb25Qb2ludC5JRCwgaGVscGVySW5mby5nZXRJZCgpKTsNCisJCW11bHRpZmVhdHVyZS5zZXRBdHRyaWJ1dGUoRXh0ZW5zaW9uUG9pbnQuREVTQ1JJUFRJT04sIGhlbHBlckluZm8uZ2V0RGVzY3JpcHRpb24oKSk7DQorCQltdWx0aWZlYXR1cmUuc2V0QXR0cmlidXRlKEV4dGVuc2lvblBvaW50Lk5BTUVTUEFDRVVSSSwgaGVscGVySW5mby5nZXROYW1lc3BhY2VVcmkoKSk7DQorCQltdWx0aWZlYXR1cmUuc2V0QXR0cmlidXRlKEV4dGVuc2lvblBvaW50LkNMQVNTLCBoZWxwZXJJbmZvLmdldFF1YWxpZmllZENsYXNzTmFtZSgpKTsNCisJCXJldHVybiBtdWx0aWZlYXR1cmU7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL3dpemFyZHMvQmFzaWNzV2l6YXJkUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL3dpemFyZHMvQmFzaWNzV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjMxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvd2l6YXJkcy9CYXNpY3NXaXphcmRQYWdlLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2UgY29tcmVsLmdlbmVyYXRvci5oZWxwZXIud2l6YXJkczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ow0KKw0KK3B1YmxpYyBjbGFzcyBCYXNpY3NXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsNCisJcHJpdmF0ZSBUZXh0IHR4dE5hbWU7DQorCXByaXZhdGUgVGV4dCB0eHREZXNjcmlwdGlvbjsNCisJcHJpdmF0ZSBTdHJpbmcgaGVscGVyTmFtZSA9ICIiOw0KKwlwcml2YXRlIFN0cmluZyBoZWxwZXJEZXNjcmlwdGlvbiA9ICIiOw0KKw0KKwkvKioNCisJICogQ3JlYXRlIHRoZSB3aXphcmQuDQorCSAqLw0KKwlwdWJsaWMgQmFzaWNzV2l6YXJkUGFnZSgpIHsNCisJCXN1cGVyKCJIZWxwZXJCYXNpY3NXaXphcmRQYWdlIik7DQorCQlzZXRUaXRsZSgiQmFzaWMgSGVscGVyIGRhdGEiKTsNCisJCXNldERlc2NyaXB0aW9uKCJQbGVhc2UgaW5zZXJ0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgcmVmYWN0b3JpbmcgaGVscGVyLiIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgY29udGVudHMgb2YgdGhlIHdpemFyZC4NCisJICogQHBhcmFtIHBhcmVudA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQorCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsNCisNCisJCXNldENvbnRyb2woY29udGFpbmVyKTsNCisJCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsNCisJCQ0KKwkJTGFiZWwgbGJsUGxlYXNlSW5zZXJ0QSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsNCisJCWxibFBsZWFzZUluc2VydEEuc2V0VGV4dCgiTmFtZSBvZiB0aGUgSGVscGVyKiAobXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyKToiKTsNCisJCQ0KKwkJdHh0TmFtZSA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7DQorCQlHcmlkRGF0YSBnZF90eHROYW1lID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpOw0KKwkJZ2RfdHh0TmFtZS53aWR0aEhpbnQgPSA2MDA7DQorCQl0eHROYW1lLnNldExheW91dERhdGEoZ2RfdHh0TmFtZSk7DQorCQl0eHROYW1lLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOw0KKwkJdHh0TmFtZS5zZXRGb2N1cygpOw0KKwkJDQorCQlMYWJlbCBsYmxOZXdMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsNCisJCWxibE5ld0xhYmVsLnNldFRleHQoIkRlc2NyaXB0aW9uIG9mIGl0cyBpbnRlbmRlZCBwdXJwb3NlOiIpOw0KKwkJDQorCQl0eHREZXNjcmlwdGlvbiA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7DQorCQlHcmlkRGF0YSBnZF90eHREZXNjcmlwdGlvbiA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKTsNCisJCWdkX3R4dERlc2NyaXB0aW9uLmhlaWdodEhpbnQgPSAxOTU7DQorCQlnZF90eHREZXNjcmlwdGlvbi53aWR0aEhpbnQgPSA2MDA7DQorCQl0eHREZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkX3R4dERlc2NyaXB0aW9uKTsNCisJCXR4dERlc2NyaXB0aW9uLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOw0KKwkJDQorCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7DQorCQlpZiAoZXZlbnQud2lkZ2V0ID09IHR4dE5hbWUpIHsNCisJCQloZWxwZXJOYW1lID0gdHh0TmFtZS5nZXRUZXh0KCk7DQorCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7DQorCQl9DQorCQlpZiAoZXZlbnQud2lkZ2V0ID09IHR4dERlc2NyaXB0aW9uKSB7DQorCQkJaGVscGVyRGVzY3JpcHRpb24gPSB0eHREZXNjcmlwdGlvbi5nZXRUZXh0KCk7DQorCQl9DQorCX0NCisNCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0ZSgpIHsNCisJCWlmIChoZWxwZXJOYW1lLmlzRW1wdHkoKSkgew0KKwkJCXRoaXMuc2V0TWVzc2FnZSgiVGhlIG5hbWUgb2YgdGhlIGhlbHBlciBpcyBub3Qgc3BlY2lmaWVkLiIsIEVSUk9SKTsNCisJCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQorCQl9IGVsc2Ugew0KKwkJCWNoYXIgYyA9IGhlbHBlck5hbWUuY2hhckF0KDApOw0KKwkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKSB7DQorCQkJCXRoaXMuc2V0TWVzc2FnZSgiUGxlYXNlIGluc2VydCBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHJlZmFjdG9yaW5nIGhlbHBlci4iKTsNCisJCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7DQorCQkJfSBlbHNlIHsNCisJCQkJdGhpcy5zZXRNZXNzYWdlKCJUaGUgbmFtZSBvZiB0aGUgaGVscGVyIG11c3QgYmVnaW4gd2l0aCBhbiB1cHBlciBjYXNlIGxldHRlci4iLCBFUlJPUik7DQorCQkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRIZWxwZXJOYW1lKCkgew0KKwkJcmV0dXJuIGhlbHBlck5hbWU7DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7DQorCQlyZXR1cm4gaGVscGVyTmFtZS5yZXBsYWNlQWxsKCIgIiwgIiIpOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0SGVscGVyRGVzY3JpcHRpb24oKSB7DQorCQlyZXR1cm4gaGVscGVyRGVzY3JpcHRpb247DQorCX0NCisJDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL0VjbGlwc2VXaXphcmRQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvd2l6YXJkcy9FY2xpcHNlV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NGNhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvd2l6YXJkcy9FY2xpcHNlV2l6YXJkUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACitwYWNrYWdlIGNvbXJlbC5nZW5lcmF0b3IuaGVscGVyLndpemFyZHM7DQorDQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7DQorDQorcHVibGljIGNsYXNzIEVjbGlwc2VXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsNCisJDQorCXByaXZhdGUgVGV4dCB0eHRJZDsNCisJcHJpdmF0ZSBDb21ibyBjb21ib1Byb2plY3Q7DQorCQ0KKwlwcml2YXRlIExpbmtlZExpc3Q8SVByb2plY3Q+IHByb2plY3RzOw0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5OQVRVUkUgPSAib3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZSI7DQorCXByaXZhdGUgU3RyaW5nW10gcHJvamVjdE5hbWVzOw0KKwkNCisJcHJpdmF0ZSBTdHJpbmcgaWQgPSAiIjsNCisJcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0Ow0KKw0KKwkvKioNCisJICogQ3JlYXRlIHRoZSB3aXphcmQuDQorCSAqLw0KKwlwdWJsaWMgRWNsaXBzZVdpemFyZFBhZ2UoKSB7DQorCQlzdXBlcigiRWNsaXBzZVdpemFyZFBhZ2UiKTsNCisJCXNldFRpdGxlKCJFY2xpcHNlIFNwZWNpZmljcyIpOw0KKwkJc2V0RGVzY3JpcHRpb24oIlBsZWFzZSBpbnNlcnQgYSB1bmlxdWUgaWQgYW5kIHNlbGVjdCBhIHBsdWctaW4gcHJvamVjdC4iKTsNCisJCWluaXRQcm9qZWN0cygpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgY29udGVudHMgb2YgdGhlIHdpemFyZC4NCisJICogQHBhcmFtIHBhcmVudA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQorCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsNCisNCisJCXNldENvbnRyb2woY29udGFpbmVyKTsNCisJCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsNCisJCQ0KKwkJTGFiZWwgbGJsVW5pcXVlSGVscGVySWQgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7DQorCQlsYmxVbmlxdWVIZWxwZXJJZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOw0KKwkJbGJsVW5pcXVlSGVscGVySWQuc2V0VGV4dCgiVW5pcXVlIGhlbHBlciBpZDoiKTsNCisJCQ0KKwkJdHh0SWQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOw0KKwkJdHh0SWQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7DQorCQl0eHRJZC5zZXRGb2N1cygpOw0KKwkJdHh0SWQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7DQorCQkNCisJCUxhYmVsIGxibEVjbGlwc2VQbHVnaW5Qcm9qZWN0ID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOw0KKwkJbGJsRWNsaXBzZVBsdWdpblByb2plY3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDEsIDEpKTsNCisJCWxibEVjbGlwc2VQbHVnaW5Qcm9qZWN0LnNldFRleHQoIkVjbGlwc2UgcGx1Zy1pbiBwcm9qZWN0OiIpOw0KKwkJDQorCQljb21ib1Byb2plY3QgPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuTk9ORSk7DQorCQljb21ib1Byb2plY3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7DQorCQljb21ib1Byb2plY3QuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7DQorCQkNCisJCXNldFByb2plY3RDb21ibygpOw0KKwkJDQorCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQorCX0NCisJDQorCXByaXZhdGUgdm9pZCBzZXRQcm9qZWN0Q29tYm8oKSB7DQorCQlwcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW3Byb2plY3RzLnNpemUoKV07DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgew0KKwkJCXByb2plY3ROYW1lc1tpXSA9IHByb2plY3RzLmdldChpKS5nZXROYW1lKCk7DQorCQl9DQorCQljb21ib1Byb2plY3Quc2V0SXRlbXMocHJvamVjdE5hbWVzKTsNCisJfQ0KKw0KKwlwcml2YXRlIHZvaWQgaW5pdFByb2plY3RzKCkgew0KKwkJdGhpcy5wcm9qZWN0cyA9IG5ldyBMaW5rZWRMaXN0PElQcm9qZWN0PigpOw0KKwkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsNCisJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IGFsbFByb2plY3RzKSB7DQorCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsNCisJCQkJSVByb2plY3ROYXR1cmUgbmF0dXJlID0gbnVsbDsNCisJCQkJdHJ5IHsNCisJCQkJCW5hdHVyZSA9IHByb2plY3QuZ2V0TmF0dXJlKFBMVUdJTk5BVFVSRSk7DQorCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQkJfQ0KKwkJCQlpZiAobnVsbCAhPSBuYXR1cmUpIA0KKwkJCQkJdGhpcy5wcm9qZWN0cy5hZGQocHJvamVjdCk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgew0KKwkJaWYgKGV2ZW50LndpZGdldCA9PSB0eHRJZCkgew0KKwkJCWlkID0gdHh0SWQuZ2V0VGV4dCgpOw0KKwkJfQ0KKwkJaWYgKGV2ZW50LndpZGdldCA9PSBjb21ib1Byb2plY3QpIHsNCisJCQlzZXRQcm9qZWN0KGNvbWJvUHJvamVjdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsNCisJCX0NCisJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOw0KKwl9DQorDQorCXByaXZhdGUgdm9pZCBzZXRQcm9qZWN0KGludCBpbmRleCkgew0KKwkJaWYgKGluZGV4ID09IC0xKSB7DQorCQkJcHJvamVjdCA9IG51bGw7DQorCQl9IGVsc2Ugew0KKwkJCXByb2plY3QgPSBwcm9qZWN0cy5nZXQoaW5kZXgpOw0KKwkJfQ0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0ZSgpIHsNCisJCWlmIChpZC5pc0VtcHR5KCkpIHsNCisJCQl0aGlzLnNldE1lc3NhZ2UoIlRoZSBpZCBvZiB0aGUgaGVscGVyIGlzIG5vdCBzcGVjaWZpZWQuIiwgRVJST1IpOw0KKwkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCisJCX0gZWxzZSB7DQorCQkJY2hhciBmaXJzdENoYXIgPSBpZC5jaGFyQXQoMCk7DQorCQkJY2hhciBsYXN0Q2hhciA9IGlkLmNoYXJBdChpZC5sZW5ndGgoKSAtIDEpOw0KKwkJCWlmICgoZmlyc3RDaGFyID09ICcuJykgfHwgKGxhc3RDaGFyID09ICcuJykpIHsNCisJCQkJdGhpcy5zZXRNZXNzYWdlKCJUaGUgaGVscGVyIGlkIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgZG90ICgnLicpIiwgRVJST1IpOw0KKwkJCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQorCQkJfSBlbHNlIHsNCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZC5sZW5ndGgoKTsgaSsrKSB7DQorCQkJCQljaGFyIGMgPSBpZC5jaGFyQXQoaSk7DQorCQkJCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGMpIHx8IChjID09ICcuJykpIHsNCisJCQkJCQlpZiAocHJvamVjdCA9PSBudWxsKSB7DQorCQkJCQkJCXRoaXMuc2V0TWVzc2FnZSgiUGxlYXNlIHNlbGVjdCBhIHBsdWctaW4gcHJvamVjdC4iLCBFUlJPUik7DQorCQkJCQkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCisJCQkJCQl9IGVsc2Ugew0KKwkJCQkJCQl0aGlzLnNldE1lc3NhZ2UoIlBsZWFzZSBpbnNlcnQgYSB1bmlxdWUgaWQgYW5kIHNlbGVjdCBhIHBsdWctaW4gcHJvamVjdC4iKTsNCisJCQkJCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7DQorCQkJCQkJfQ0KKwkJCQkJfSBlbHNlIHsNCisJCQkJCQl0aGlzLnNldE1lc3NhZ2UoIlRoZSBoZWxwZXIgaWQgbXVzdCBjb25zaXN0IG9mIGNoYXJhY3RlcnMgYW5kL29yIGRvdHMgKCcuJykiLCBFUlJPUik7DQorCQkJCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQorCQlyZXR1cm4gaWQ7DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsNCisJCXJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvd2l6YXJkcy9NZXRhTW9kZWxXaXphcmRQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvd2l6YXJkcy9NZXRhTW9kZWxXaXphcmRQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhMDcxZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL01ldGFNb2RlbFdpemFyZFBhZ2UuamF2YQpAQCAtMCwwICsxLDI1MCBAQAorcGFja2FnZSBjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci53aXphcmRzOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLlJlZ2lzdHJ5UmVhZGVyOw0KKw0KK3B1YmxpYyBjbGFzcyBNZXRhTW9kZWxXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsNCisJDQorCXByaXZhdGUgQ29tYm8gY29tYm9NTSwgY29tYm9JbnB1dCwgY29tYm9PdXRwdXQ7DQorCQ0KKwlwcml2YXRlIFN0cmluZ1tdIG1ldGFNb2RlbHM7DQorCXByaXZhdGUgRVBhY2thZ2UgbWV0YU1vZGVsOw0KKwlwcml2YXRlIFN0cmluZ1tdIG1vZGVsRWxlbWVudE5hbWVzOw0KKwlwcml2YXRlIEVDbGFzcyBpbnB1dFBvcnRUeXBlOw0KKwlwcml2YXRlIE9iamVjdCBvdXRwdXRQb3J0VHlwZTsNCisJDQorCXByaXZhdGUgYm9vbGVhbiBpc0ZpbHRlcjsNCisNCisJLyoqDQorCSAqIENyZWF0ZSB0aGUgd2l6YXJkLg0KKwkgKi8NCisJcHVibGljIE1ldGFNb2RlbFdpemFyZFBhZ2UoYm9vbGVhbiBpc0ZpbHRlcikgew0KKwkJc3VwZXIoIkhlbHBlck1ldGFNb2RlbFdpemFyZFBhZ2UiKTsNCisJCXNldFRpdGxlKCJNZXRhIG1vZGVsIERhdGEiKTsNCisJCXNldERlc2NyaXB0aW9uKCJQbGVhc2Ugc2VsZWN0IGEgbWV0YSBtb2RlbCBhbmQgY29ycmVzcG9uZGluZyBwb3J0IHR5cGUocykuIik7DQorCQl0aGlzLmlzRmlsdGVyID0gaXNGaWx0ZXI7DQorCQlpbml0TWV0YU1vZGVscygpOw0KKwl9DQorCQ0KKwlwcml2YXRlIHZvaWQgc2V0Q29tYm9NTSgpIHsNCisJCWNvbWJvTU0uc2V0SXRlbXMobWV0YU1vZGVscyk7DQorCX0NCisNCisJcHJpdmF0ZSB2b2lkIGluaXRNZXRhTW9kZWxzKCkgew0KKwkJbWV0YU1vZGVscyA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5zaXplKCldKTsNCisJCUFycmF5cy5zb3J0KG1ldGFNb2RlbHMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGUgY29udGVudHMgb2YgdGhlIHdpemFyZC4NCisJICogQHBhcmFtIHBhcmVudA0KKwkgKi8NCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQorCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsNCisNCisJCXNldENvbnRyb2woY29udGFpbmVyKTsNCisJCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsNCisJCQ0KKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7DQorCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7DQorCQkNCisJCUxhYmVsIGxibE1ldGFNb2RlbFRoZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsNCisJCUdyaWREYXRhIGdkX2xibE1ldGFNb2RlbFRoZSA9IG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMSwgMSk7DQorCQlnZF9sYmxNZXRhTW9kZWxUaGUud2lkdGhIaW50ID0gMjcwOw0KKwkJbGJsTWV0YU1vZGVsVGhlLnNldExheW91dERhdGEoZ2RfbGJsTWV0YU1vZGVsVGhlKTsNCisJCWxibE1ldGFNb2RlbFRoZS5zZXRUZXh0KCJNZXRhIG1vZGVsIHRoZSBIZWxwZXIgY29uZm9ybXMgdG86Iik7DQorCQkNCisJCWNvbWJvTU0gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTk9ORSk7DQorCQlHcmlkRGF0YSBnZF9jb21ib01NID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSk7DQorCQlnZF9jb21ib01NLndpZHRoSGludCA9IDMzMDsNCisJCWNvbWJvTU0uc2V0TGF5b3V0RGF0YShnZF9jb21ib01NKTsNCisJCQ0KKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZV8xID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsNCisJCWNvbXBvc2l0ZV8xLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOw0KKwkJDQorCQlMYWJlbCBsYmxNZXRhTW9kZWxUeXBlID0gbmV3IExhYmVsKGNvbXBvc2l0ZV8xLCBTV1QuTk9ORSk7DQorCQlHcmlkRGF0YSBnZF9sYmxNZXRhTW9kZWxUeXBlID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKTsNCisJCWdkX2xibE1ldGFNb2RlbFR5cGUud2lkdGhIaW50ID0gMjcwOw0KKwkJbGJsTWV0YU1vZGVsVHlwZS5zZXRMYXlvdXREYXRhKGdkX2xibE1ldGFNb2RlbFR5cGUpOw0KKwkJbGJsTWV0YU1vZGVsVHlwZS5zZXRUZXh0KCJNZXRhIG1vZGVsIHR5cGUgb2YgdGhlIGlucHV0IHBvcnQ6Iik7DQorCQkNCisJCWNvbWJvSW5wdXQgPSBuZXcgQ29tYm8oY29tcG9zaXRlXzEsIFNXVC5OT05FKTsNCisJCWNvbWJvSW5wdXQuc2V0RW5hYmxlZChmYWxzZSk7DQorCQlHcmlkRGF0YSBnZF9jb21ib0lucHV0ID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSk7DQorCQlnZF9jb21ib0lucHV0LndpZHRoSGludCA9IDMzMDsNCisJCWNvbWJvSW5wdXQuc2V0TGF5b3V0RGF0YShnZF9jb21ib0lucHV0KTsNCisJCQ0KKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZV8yID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsNCisJCWNvbXBvc2l0ZV8yLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOw0KKwkJDQorCQlMYWJlbCBsYmxNZXRhTW9kZWxUeXBlXzEgPSBuZXcgTGFiZWwoY29tcG9zaXRlXzIsIFNXVC5OT05FKTsNCisJCUdyaWREYXRhIGdkX2xibE1ldGFNb2RlbFR5cGVfMSA9IG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMSwgMSk7DQorCQlnZF9sYmxNZXRhTW9kZWxUeXBlXzEud2lkdGhIaW50ID0gMjcwOw0KKwkJbGJsTWV0YU1vZGVsVHlwZV8xLnNldExheW91dERhdGEoZ2RfbGJsTWV0YU1vZGVsVHlwZV8xKTsNCisJCWxibE1ldGFNb2RlbFR5cGVfMS5zZXRUZXh0KCJNZXRhIG1vZGVsIHR5cGUgb2YgdGhlIG91dHB1dCBwb3J0OiIpOw0KKwkJDQorCQljb21ib091dHB1dCA9IG5ldyBDb21ibyhjb21wb3NpdGVfMiwgU1dULk5PTkUpOw0KKwkJY29tYm9PdXRwdXQuc2V0RW5hYmxlZChmYWxzZSk7DQorCQlHcmlkRGF0YSBnZF9jb21ib091dHB1dCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDEsIDEpOw0KKwkJZ2RfY29tYm9PdXRwdXQud2lkdGhIaW50ID0gMzMwOw0KKwkJY29tYm9PdXRwdXQuc2V0TGF5b3V0RGF0YShnZF9jb21ib091dHB1dCk7DQorCQkNCisJCXNldENvbWJvTU0oKTsNCisJCWNvbWJvTU0uc2V0Rm9jdXMoKTsNCisJCWNvbWJvTU0uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7DQorCQljb21ib0lucHV0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOw0KKwkJY29tYm9PdXRwdXQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7DQorCQkNCisJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsNCisJCWlmIChldmVudC53aWRnZXQgPT0gY29tYm9NTSkgew0KKwkJCXNldEVsZW1lbnRDb21ib3MoY29tYm9NTS5nZXRTZWxlY3Rpb25JbmRleCgpKTsNCisJCX0NCisJCWlmIChldmVudC53aWRnZXQgPT0gY29tYm9JbnB1dCkgew0KKwkJCXNldElucHV0UG9ydFR5cGUoY29tYm9JbnB1dC5nZXRTZWxlY3Rpb25JbmRleCgpKTsNCisJCQlpZiAoaXNGaWx0ZXIpIHsNCisJCQkJaWYgKGNvbWJvSW5wdXQuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkgew0KKwkJCQkJY29tYm9PdXRwdXQuZGVzZWxlY3RBbGwoKTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCWNvbWJvT3V0cHV0LnNlbGVjdChjb21ib0lucHV0LmdldFNlbGVjdGlvbkluZGV4KCkpOw0KKwkJCQl9DQorCQkJCW91dHB1dFBvcnRUeXBlID0gaW5wdXRQb3J0VHlwZTsNCisJCQl9DQorCQl9DQorCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNvbWJvT3V0cHV0KSB7DQorCQkJc2V0T3V0cHV0UG9ydFR5cGUoY29tYm9PdXRwdXQuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7DQorCQl9DQorCQl1cGRhdGVQYWdlQ29tcGxldGUoKTsNCisJfQ0KKw0KKwlwcml2YXRlIHZvaWQgc2V0T3V0cHV0UG9ydFR5cGUoaW50IGluZGV4KSB7DQorCQlpZiAoaW5kZXggPT0gLTEpIHsNCisJCQlvdXRwdXRQb3J0VHlwZSA9IG51bGw7DQorCQl9IGVsc2UgewkNCisJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjb21ib091dHB1dC5nZXRJdGVtKGluZGV4KTsNCisJCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKCJTdHJpbmciKSkgew0KKwkJCQlvdXRwdXRQb3J0VHlwZSA9IGVsZW1lbnROYW1lOw0KKwkJCX0gZWxzZSB7DQorCQkJCW91dHB1dFBvcnRUeXBlID0gZ2V0RUNsYXNzRnJvbU5hbWUoZWxlbWVudE5hbWUpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlwcml2YXRlIHZvaWQgc2V0SW5wdXRQb3J0VHlwZShpbnQgaW5kZXgpIHsNCisJCWlmIChpbmRleCA9PSAtMSkgew0KKwkJCWlucHV0UG9ydFR5cGUgPSBudWxsOw0KKwkJfSBlbHNlIHsJCQkNCisJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjb21ib0lucHV0LmdldEl0ZW0oaW5kZXgpOw0KKwkJCWlucHV0UG9ydFR5cGUgPSBnZXRFQ2xhc3NGcm9tTmFtZShlbGVtZW50TmFtZSk7DQorCQl9DQorCX0NCisNCisJcHJpdmF0ZSBFQ2xhc3MgZ2V0RUNsYXNzRnJvbU5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7DQorCQlUcmVlSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IG1ldGFNb2RlbC5lQWxsQ29udGVudHMoKTsNCisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KKwkJCUVPYmplY3QgZU9iamVjdCA9IGl0ZXIubmV4dCgpOw0KKwkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRUNsYXNzKSB7DQorCQkJCWlmICgoKEVDbGFzcykgZU9iamVjdCkuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50TmFtZSkpIHsNCisJCQkJCXJldHVybiAoKEVDbGFzcykgZU9iamVjdCk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwlwcml2YXRlIHZvaWQgc2V0RWxlbWVudENvbWJvcyhpbnQgaW5kZXgpIHsNCisJCWlmIChpbmRleCA9PSAtMSkgew0KKwkJCWNvbWJvSW5wdXQucmVtb3ZlQWxsKCk7DQorCQkJY29tYm9PdXRwdXQucmVtb3ZlQWxsKCk7DQorCQkJY29tYm9JbnB1dC5zZXRFbmFibGVkKGZhbHNlKTsNCisJCQljb21ib091dHB1dC5zZXRFbmFibGVkKGZhbHNlKTsJCQkNCisJCX0gZWxzZSB7DQorCQkJU3RyaW5nIG1tID0gY29tYm9NTS5nZXRJdGVtKGluZGV4KTsNCisJCQkvLyBuZXcNCisJCQlPYmplY3QgdmFsdWUgPSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQobW0pOw0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbih2YWx1ZSk7DQorCQkJbWV0YU1vZGVsID0gKEVQYWNrYWdlKSB2YWx1ZTsNCisJCQlzZXRNb2RlbEVsZW1lbnROYW1lcygpOw0KKwkJCWNvbWJvSW5wdXQuc2V0SXRlbXMobW9kZWxFbGVtZW50TmFtZXMpOw0KKwkJCWNvbWJvSW5wdXQuc2V0RW5hYmxlZCh0cnVlKTsNCisJCQljb21ib091dHB1dC5zZXRJdGVtcyhtb2RlbEVsZW1lbnROYW1lcyk7DQorCQkJY29tYm9PdXRwdXQuYWRkKCJTdHJpbmciKTsNCisJCQljb21ib091dHB1dC5zZXRFbmFibGVkKCEgaXNGaWx0ZXIpOw0KKwkJfQ0KKwl9DQorDQorCXByaXZhdGUgdm9pZCBzZXRNb2RlbEVsZW1lbnROYW1lcygpIHsNCisJCUVMaXN0PEVDbGFzcz4gZUNsYXNzZXMgPSBuZXcgQmFzaWNFTGlzdDxFQ2xhc3M+KCk7DQorCQlUcmVlSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IG1ldGFNb2RlbC5lQWxsQ29udGVudHMoKTsNCisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KKwkJCUVPYmplY3QgZU9iamVjdCA9IGl0ZXIubmV4dCgpOw0KKwkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRUNsYXNzKSB7DQorCQkJCWVDbGFzc2VzLmFkZCgoRUNsYXNzKSBlT2JqZWN0KTsNCisJCQl9DQorCQl9DQorCQltb2RlbEVsZW1lbnROYW1lcyA9IG5ldyBTdHJpbmdbZUNsYXNzZXMuc2l6ZSgpXTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxFbGVtZW50TmFtZXMubGVuZ3RoOyBpKyspIHsNCisJCQltb2RlbEVsZW1lbnROYW1lc1tpXSA9IGVDbGFzc2VzLmdldChpKS5nZXROYW1lKCk7DQorCQl9DQorCQlBcnJheXMuc29ydChtb2RlbEVsZW1lbnROYW1lcyk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0ZSgpIHsNCisJCWlmIChjb21ib01NLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpIHsNCisJCQl0aGlzLnNldE1lc3NhZ2UoIlRoZSBtZXRhIG1vZGVsIGlzIG5vdCBzcGVjaWZpZWQuIiwgRVJST1IpOw0KKwkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCisJCQlyZXR1cm47DQorCQl9IA0KKwkJaWYgKGNvbWJvSW5wdXQuaXNFbmFibGVkKCkgJiYgKGNvbWJvSW5wdXQuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkpIHsNCisJCQl0aGlzLnNldE1lc3NhZ2UoIlRoZSB0eXBlIG9mIHRoZSBpbnB1dCBwb3J0IGlzIG5vdCBzcGVjaWZpZWQuIiwgRVJST1IpOw0KKwkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCisJCQlyZXR1cm47DQorCQl9IA0KKwkJaWYgKGNvbWJvT3V0cHV0LmlzRW5hYmxlZCgpICYmIChjb21ib091dHB1dC5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKSkgew0KKwkJCXRoaXMuc2V0TWVzc2FnZSgiVGhlIHR5cGUgb2YgdGhlIG91dHB1dCBwb3J0IGlzIG5vdCBzcGVjaWZpZWQuIiwgRVJST1IpOw0KKwkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCisJCQlyZXR1cm47DQorCQl9DQorCQl0aGlzLnNldE1lc3NhZ2UoIlBsZWFzZSBzZWxlY3QgYSBtZXRhIG1vZGVsIGFuZCBjb3JyZXNwb25kaW5nIHBvcnQgdHlwZShzKS4iKTsNCisJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCkgew0KKwkJcmV0dXJuIG1ldGFNb2RlbC5nZXROc1VSSSgpOw0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRUeXBlTmFtZSgpIHsNCisJCXJldHVybiBpbnB1dFBvcnRUeXBlLmdldEluc3RhbmNlQ2xhc3NOYW1lKCk7DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRPdXRwdXRUeXBlTmFtZSgpIHsNCisJCWlmIChvdXRwdXRQb3J0VHlwZS5lcXVhbHMoIlN0cmluZyIpKSB7DQorCQkJcmV0dXJuICJTdHJpbmciOw0KKwkJfSBlbHNlIHsNCisJCQlyZXR1cm4gKChFQ2xhc3MpIG91dHB1dFBvcnRUeXBlKS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpOw0KKwkJfQ0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0SmFyRmlsZU5hbWUoKSB7DQorCQlyZXR1cm4gaW5wdXRQb3J0VHlwZS5nZXRJbnN0YW5jZUNsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvd2l6YXJkcy9NdWx0aUZlYXR1cmVXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL011bHRpRmVhdHVyZVdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OTdlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci9zcmMvY29tcmVsL2dlbmVyYXRvci9oZWxwZXIvd2l6YXJkcy9NdWx0aUZlYXR1cmVXaXphcmQuamF2YQpAQCAtMCwwICsxLDkyIEBACitwYWNrYWdlIGNvbXJlbC5nZW5lcmF0b3IuaGVscGVyLndpemFyZHM7DQorDQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsNCisNCitpbXBvcnQgY29tcmVsLmdlbmVyYXRvci5oZWxwZXIuSGVscGVyR2VuZXJhdG9yOw0KK2ltcG9ydCBjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci5IZWxwZXJJbmZvOw0KK2ltcG9ydCBjb21yZWwudXRpbC5FeHRlbnNpb25Qb2ludEluZm87DQorDQorcHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgew0KKw0KK3ByaXZhdGUgZmluYWwgU3RyaW5nIFdJTkRPV1RJVExFID0gIk5ldyBNdWx0aSBGZWF0dXJlIjsNCisJDQorCXByaXZhdGUgQmFzaWNzV2l6YXJkUGFnZSBiYXNpY3NXaXphcmRQYWdlOw0KKwlwcml2YXRlIE1ldGFNb2RlbFdpemFyZFBhZ2UgbWV0YU1vZGVsV2l6YXJkUGFnZTsNCisJcHJpdmF0ZSBFY2xpcHNlV2l6YXJkUGFnZSBlY2xpcHNlV2l6YXJkUGFnZTsNCisNCisJcHVibGljIE11bHRpRmVhdHVyZVdpemFyZCgpIHsgfQ0KKwkNCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7DQorCQlzZXRXaW5kb3dUaXRsZShXSU5ET1dUSVRMRSk7DQorCQliYXNpY3NXaXphcmRQYWdlID0gbmV3IEJhc2ljc1dpemFyZFBhZ2UoKTsNCisJCWFkZFBhZ2UoYmFzaWNzV2l6YXJkUGFnZSk7DQorCQltZXRhTW9kZWxXaXphcmRQYWdlID0gbmV3IE1ldGFNb2RlbFdpemFyZFBhZ2UoZmFsc2UpOw0KKwkJYWRkUGFnZShtZXRhTW9kZWxXaXphcmRQYWdlKTsNCisJCWVjbGlwc2VXaXphcmRQYWdlID0gbmV3IEVjbGlwc2VXaXphcmRQYWdlKCk7DQorCQlhZGRQYWdlKGVjbGlwc2VXaXphcmRQYWdlKTsNCisJfQ0KKwkNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsNCisJCXJldHVybiAoYmFzaWNzV2l6YXJkUGFnZS5pc1BhZ2VDb21wbGV0ZSgpIA0KKwkJCQkmJiBtZXRhTW9kZWxXaXphcmRQYWdlLmlzUGFnZUNvbXBsZXRlKCkNCisJCQkJJiYgZWNsaXBzZVdpemFyZFBhZ2UuaXNQYWdlQ29tcGxldGUoKSk7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeyB9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgew0KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCisJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsNCisJCQkJdHJ5IHsJCQkJDQorCQkJCQljcmVhdGVIZWxwZXIobW9uaXRvcik7DQorCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsNCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCX0gZmluYWxseSB7DQorCQkJCQltb25pdG9yLmRvbmUoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX07DQorCQl0cnkgew0KKwkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgZmFsc2UsIG9wKTsNCisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUhlbHBlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCisJCUhlbHBlckluZm8gaGVscGVySW5mbyA9IGNyZWF0ZUhlbHBlckluZm8oKTsNCisJCVN5c3RlbS5vdXQucHJpbnRsbihoZWxwZXJJbmZvLnRvU3RyaW5nKCkpOw0KKwkJSGVscGVyR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBIZWxwZXJHZW5lcmF0b3IoaGVscGVySW5mbyk7DQorCQlnZW5lcmF0b3IucnVuKG1vbml0b3IsIEV4dGVuc2lvblBvaW50SW5mby5NVUxUSUZFQVRVUkUsIEV4dGVuc2lvblBvaW50SW5mby5NVUxUSUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UKTsNCisJfQ0KKw0KKwlwcml2YXRlIEhlbHBlckluZm8gY3JlYXRlSGVscGVySW5mbygpIHsNCisJCVN0cmluZyBuYW1lID0gYmFzaWNzV2l6YXJkUGFnZS5nZXRIZWxwZXJOYW1lKCk7DQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBiYXNpY3NXaXphcmRQYWdlLmdldEhlbHBlckRlc2NyaXB0aW9uKCk7DQorCQlTdHJpbmcgaWQgPSBlY2xpcHNlV2l6YXJkUGFnZS5nZXRJZCgpOw0KKwkJU3RyaW5nIG5hbWVzcGFjZVVyaSA9IG1ldGFNb2RlbFdpemFyZFBhZ2UuZ2V0TmFtZXNwYWNlVXJpKCk7DQorCQlTdHJpbmcgY2xhc3NOYW1lID0gYmFzaWNzV2l6YXJkUGFnZS5nZXRDbGFzc05hbWUoKTsNCisJCVN0cmluZyBqYXJGaWxlID0gbWV0YU1vZGVsV2l6YXJkUGFnZS5nZXRKYXJGaWxlTmFtZSgpOw0KKwkJU3RyaW5nIGlucHV0VHlwZSA9IG1ldGFNb2RlbFdpemFyZFBhZ2UuZ2V0SW5wdXRUeXBlTmFtZSgpOw0KKwkJU3RyaW5nIG91dHB1dFR5cGUgPSBtZXRhTW9kZWxXaXphcmRQYWdlLmdldE91dHB1dFR5cGVOYW1lKCk7DQorCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBlY2xpcHNlV2l6YXJkUGFnZS5nZXRQcm9qZWN0TmFtZSgpOw0KKwkJcmV0dXJuIG5ldyBIZWxwZXJJbmZvKG5hbWUsIGRlc2NyaXB0aW9uLCBpZCwgbmFtZXNwYWNlVXJpLCBjbGFzc05hbWUsIA0KKwkJCQkJCQkJamFyRmlsZSwgaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCBwcm9qZWN0TmFtZSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL3dpemFyZHMvTXVsdGlGaWx0ZXJXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL011bHRpRmlsdGVyV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3YzJmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL011bHRpRmlsdGVyV2l6YXJkLmphdmEKQEAgLTAsMCArMSw5MyBAQAorcGFja2FnZSBjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci53aXphcmRzOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247DQorDQoraW1wb3J0IGNvbXJlbC5nZW5lcmF0b3IuaGVscGVyLkhlbHBlckdlbmVyYXRvcjsNCitpbXBvcnQgY29tcmVsLmdlbmVyYXRvci5oZWxwZXIuSGVscGVySW5mbzsNCitpbXBvcnQgY29tcmVsLnV0aWwuRXh0ZW5zaW9uUG9pbnRJbmZvOw0KKw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlcldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgew0KKw0KK3ByaXZhdGUgZmluYWwgU3RyaW5nIFdJTkRPV1RJVExFID0gIk5ldyBNdWx0aSBGaWx0ZXIiOw0KKwkNCisJcHJpdmF0ZSBCYXNpY3NXaXphcmRQYWdlIGJhc2ljc1dpemFyZFBhZ2U7DQorCXByaXZhdGUgTWV0YU1vZGVsV2l6YXJkUGFnZSBtZXRhTW9kZWxXaXphcmRQYWdlOw0KKwlwcml2YXRlIEVjbGlwc2VXaXphcmRQYWdlIGVjbGlwc2VXaXphcmRQYWdlOw0KKw0KKw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJXaXphcmQoKSB7IH0NCisJDQorCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgew0KKwkJc2V0V2luZG93VGl0bGUoV0lORE9XVElUTEUpOw0KKwkJYmFzaWNzV2l6YXJkUGFnZSA9IG5ldyBCYXNpY3NXaXphcmRQYWdlKCk7DQorCQlhZGRQYWdlKGJhc2ljc1dpemFyZFBhZ2UpOw0KKwkJbWV0YU1vZGVsV2l6YXJkUGFnZSA9IG5ldyBNZXRhTW9kZWxXaXphcmRQYWdlKHRydWUpOw0KKwkJYWRkUGFnZShtZXRhTW9kZWxXaXphcmRQYWdlKTsNCisJCWVjbGlwc2VXaXphcmRQYWdlID0gbmV3IEVjbGlwc2VXaXphcmRQYWdlKCk7DQorCQlhZGRQYWdlKGVjbGlwc2VXaXphcmRQYWdlKTsNCisJfQ0KKwkNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsNCisJCXJldHVybiAoYmFzaWNzV2l6YXJkUGFnZS5pc1BhZ2VDb21wbGV0ZSgpIA0KKwkJCQkmJiBtZXRhTW9kZWxXaXphcmRQYWdlLmlzUGFnZUNvbXBsZXRlKCkNCisJCQkJJiYgZWNsaXBzZVdpemFyZFBhZ2UuaXNQYWdlQ29tcGxldGUoKSk7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeyB9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgew0KKwkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsNCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCisJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsNCisJCQkJdHJ5IHsJCQkJDQorCQkJCQljcmVhdGVIZWxwZXIobW9uaXRvcik7DQorCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsNCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJCX0gZmluYWxseSB7DQorCQkJCQltb25pdG9yLmRvbmUoKTsNCisJCQkJfQ0KKwkJCX0NCisJCX07DQorCQl0cnkgew0KKwkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgZmFsc2UsIG9wKTsNCisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUhlbHBlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCisJCUhlbHBlckluZm8gaGVscGVySW5mbyA9IGNyZWF0ZUhlbHBlckluZm8oKTsNCisJCVN5c3RlbS5vdXQucHJpbnRsbihoZWxwZXJJbmZvLnRvU3RyaW5nKCkpOw0KKwkJSGVscGVyR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBIZWxwZXJHZW5lcmF0b3IoaGVscGVySW5mbyk7DQorCQlnZW5lcmF0b3IucnVuKG1vbml0b3IsIEV4dGVuc2lvblBvaW50SW5mby5NVUxUSUZJTFRFUiwgRXh0ZW5zaW9uUG9pbnRJbmZvLk1VTFRJRklMVEVSX0VYVEVOU0lPTl9QT0lOVCk7DQorCX0NCisNCisJcHJpdmF0ZSBIZWxwZXJJbmZvIGNyZWF0ZUhlbHBlckluZm8oKSB7DQorCQlTdHJpbmcgbmFtZSA9IGJhc2ljc1dpemFyZFBhZ2UuZ2V0SGVscGVyTmFtZSgpOw0KKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gYmFzaWNzV2l6YXJkUGFnZS5nZXRIZWxwZXJEZXNjcmlwdGlvbigpOw0KKwkJU3RyaW5nIGlkID0gZWNsaXBzZVdpemFyZFBhZ2UuZ2V0SWQoKTsNCisJCVN0cmluZyBuYW1lc3BhY2VVcmkgPSBtZXRhTW9kZWxXaXphcmRQYWdlLmdldE5hbWVzcGFjZVVyaSgpOw0KKwkJU3RyaW5nIGNsYXNzTmFtZSA9IGJhc2ljc1dpemFyZFBhZ2UuZ2V0Q2xhc3NOYW1lKCk7DQorCQlTdHJpbmcgamFyRmlsZSA9IG1ldGFNb2RlbFdpemFyZFBhZ2UuZ2V0SmFyRmlsZU5hbWUoKTsNCisJCVN0cmluZyBpbnB1dFR5cGUgPSBtZXRhTW9kZWxXaXphcmRQYWdlLmdldElucHV0VHlwZU5hbWUoKTsNCisJCVN0cmluZyBvdXRwdXRUeXBlID0gbWV0YU1vZGVsV2l6YXJkUGFnZS5nZXRPdXRwdXRUeXBlTmFtZSgpOw0KKwkJU3RyaW5nIHByb2plY3ROYW1lID0gZWNsaXBzZVdpemFyZFBhZ2UuZ2V0UHJvamVjdE5hbWUoKTsNCisJCXJldHVybiBuZXcgSGVscGVySW5mbyhuYW1lLCBkZXNjcmlwdGlvbiwgaWQsIG5hbWVzcGFjZVVyaSwgY2xhc3NOYW1lLCANCisJCQkJCQkJCWphckZpbGUsIGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgcHJvamVjdE5hbWUpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL1NpbmdsZUZlYXR1cmVXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL1NpbmdsZUZlYXR1cmVXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY3MDJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL3dpemFyZHMvU2luZ2xlRmVhdHVyZVdpemFyZC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgY29tcmVsLmdlbmVyYXRvci5oZWxwZXIud2l6YXJkczsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KKw0KK2ltcG9ydCBjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci5IZWxwZXJHZW5lcmF0b3I7DQoraW1wb3J0IGNvbXJlbC5nZW5lcmF0b3IuaGVscGVyLkhlbHBlckluZm87DQoraW1wb3J0IGNvbXJlbC51dGlsLkV4dGVuc2lvblBvaW50SW5mbzsNCisNCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgew0KKw0KK3ByaXZhdGUgZmluYWwgU3RyaW5nIFdJTkRPV1RJVExFID0gIk5ldyBTaW5nbGUgRmVhdHVyZSI7DQorCQ0KKwlwcml2YXRlIEJhc2ljc1dpemFyZFBhZ2UgYmFzaWNzV2l6YXJkUGFnZTsNCisJcHJpdmF0ZSBNZXRhTW9kZWxXaXphcmRQYWdlIG1ldGFNb2RlbFdpemFyZFBhZ2U7DQorCXByaXZhdGUgRWNsaXBzZVdpemFyZFBhZ2UgZWNsaXBzZVdpemFyZFBhZ2U7DQorDQorCXB1YmxpYyBTaW5nbGVGZWF0dXJlV2l6YXJkKCkgeyB9DQorCQ0KKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCisJCXNldFdpbmRvd1RpdGxlKFdJTkRPV1RJVExFKTsNCisJCWJhc2ljc1dpemFyZFBhZ2UgPSBuZXcgQmFzaWNzV2l6YXJkUGFnZSgpOw0KKwkJYWRkUGFnZShiYXNpY3NXaXphcmRQYWdlKTsNCisJCW1ldGFNb2RlbFdpemFyZFBhZ2UgPSBuZXcgTWV0YU1vZGVsV2l6YXJkUGFnZShmYWxzZSk7DQorCQlhZGRQYWdlKG1ldGFNb2RlbFdpemFyZFBhZ2UpOw0KKwkJZWNsaXBzZVdpemFyZFBhZ2UgPSBuZXcgRWNsaXBzZVdpemFyZFBhZ2UoKTsNCisJCWFkZFBhZ2UoZWNsaXBzZVdpemFyZFBhZ2UpOw0KKwl9DQorCQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgew0KKwkJcmV0dXJuIChiYXNpY3NXaXphcmRQYWdlLmlzUGFnZUNvbXBsZXRlKCkgDQorCQkJCSYmIG1ldGFNb2RlbFdpemFyZFBhZ2UuaXNQYWdlQ29tcGxldGUoKQ0KKwkJCQkmJiBlY2xpcHNlV2l6YXJkUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsNCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQorCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7DQorCQkJCXRyeSB7CQkJCQ0KKwkJCQkJY3JlYXRlSGVscGVyKG1vbml0b3IpOw0KKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7DQorCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQl9IGZpbmFsbHkgew0KKwkJCQkJbW9uaXRvci5kb25lKCk7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKwkJdHJ5IHsNCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcCk7DQorCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIZWxwZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQorCQlIZWxwZXJJbmZvIGhlbHBlckluZm8gPSBjcmVhdGVIZWxwZXJJbmZvKCk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oaGVscGVySW5mby50b1N0cmluZygpKTsNCisJCUhlbHBlckdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgSGVscGVyR2VuZXJhdG9yKGhlbHBlckluZm8pOw0KKwkJZ2VuZXJhdG9yLnJ1bihtb25pdG9yLCBFeHRlbnNpb25Qb2ludEluZm8uU0lOR0xFRkVBVFVSRSwgRXh0ZW5zaW9uUG9pbnRJbmZvLlNJTkdMRUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UKTsNCisJfQ0KKw0KKwlwcml2YXRlIEhlbHBlckluZm8gY3JlYXRlSGVscGVySW5mbygpIHsNCisJCVN0cmluZyBuYW1lID0gYmFzaWNzV2l6YXJkUGFnZS5nZXRIZWxwZXJOYW1lKCk7DQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBiYXNpY3NXaXphcmRQYWdlLmdldEhlbHBlckRlc2NyaXB0aW9uKCk7DQorCQlTdHJpbmcgaWQgPSBlY2xpcHNlV2l6YXJkUGFnZS5nZXRJZCgpOw0KKwkJU3RyaW5nIG5hbWVzcGFjZVVyaSA9IG1ldGFNb2RlbFdpemFyZFBhZ2UuZ2V0TmFtZXNwYWNlVXJpKCk7DQorCQlTdHJpbmcgY2xhc3NOYW1lID0gYmFzaWNzV2l6YXJkUGFnZS5nZXRDbGFzc05hbWUoKTsNCisJCVN0cmluZyBqYXJGaWxlID0gbWV0YU1vZGVsV2l6YXJkUGFnZS5nZXRKYXJGaWxlTmFtZSgpOw0KKwkJU3RyaW5nIGlucHV0VHlwZSA9IG1ldGFNb2RlbFdpemFyZFBhZ2UuZ2V0SW5wdXRUeXBlTmFtZSgpOw0KKwkJU3RyaW5nIG91dHB1dFR5cGUgPSBtZXRhTW9kZWxXaXphcmRQYWdlLmdldE91dHB1dFR5cGVOYW1lKCk7DQorCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBlY2xpcHNlV2l6YXJkUGFnZS5nZXRQcm9qZWN0TmFtZSgpOw0KKwkJcmV0dXJuIG5ldyBIZWxwZXJJbmZvKG5hbWUsIGRlc2NyaXB0aW9uLCBpZCwgbmFtZXNwYWNlVXJpLCBjbGFzc05hbWUsIA0KKwkJCQkJCQkJamFyRmlsZSwgaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCBwcm9qZWN0TmFtZSk7DQorCX0NCisNCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeyB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL1NpbmdsZUZpbHRlcldpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvaGVscGVyL3dpemFyZHMvU2luZ2xlRmlsdGVyV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0ZjRhNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL2hlbHBlci93aXphcmRzL1NpbmdsZUZpbHRlcldpemFyZC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2UgY29tcmVsLmdlbmVyYXRvci5oZWxwZXIud2l6YXJkczsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOw0KKw0KK2ltcG9ydCBjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci5IZWxwZXJHZW5lcmF0b3I7DQoraW1wb3J0IGNvbXJlbC5nZW5lcmF0b3IuaGVscGVyLkhlbHBlckluZm87DQoraW1wb3J0IGNvbXJlbC51dGlsLkV4dGVuc2lvblBvaW50SW5mbzsNCisNCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7DQorDQorcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV0lORE9XVElUTEUgPSAiTmV3IFNpbmdsZSBGaWx0ZXIiOw0KKwkNCisJcHJpdmF0ZSBCYXNpY3NXaXphcmRQYWdlIGJhc2ljc1dpemFyZFBhZ2U7DQorCXByaXZhdGUgTWV0YU1vZGVsV2l6YXJkUGFnZSBtZXRhTW9kZWxXaXphcmRQYWdlOw0KKwlwcml2YXRlIEVjbGlwc2VXaXphcmRQYWdlIGVjbGlwc2VXaXphcmRQYWdlOw0KKw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyV2l6YXJkKCkgeyB9DQorCQ0KKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCisJCXNldFdpbmRvd1RpdGxlKFdJTkRPV1RJVExFKTsNCisJCWJhc2ljc1dpemFyZFBhZ2UgPSBuZXcgQmFzaWNzV2l6YXJkUGFnZSgpOw0KKwkJYWRkUGFnZShiYXNpY3NXaXphcmRQYWdlKTsNCisJCW1ldGFNb2RlbFdpemFyZFBhZ2UgPSBuZXcgTWV0YU1vZGVsV2l6YXJkUGFnZSh0cnVlKTsNCisJCWFkZFBhZ2UobWV0YU1vZGVsV2l6YXJkUGFnZSk7DQorCQllY2xpcHNlV2l6YXJkUGFnZSA9IG5ldyBFY2xpcHNlV2l6YXJkUGFnZSgpOw0KKwkJYWRkUGFnZShlY2xpcHNlV2l6YXJkUGFnZSk7DQorCX0NCisJDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7DQorCQlyZXR1cm4gKGJhc2ljc1dpemFyZFBhZ2UuaXNQYWdlQ29tcGxldGUoKSANCisJCQkJJiYgbWV0YU1vZGVsV2l6YXJkUGFnZS5pc1BhZ2VDb21wbGV0ZSgpDQorCQkJCSYmIGVjbGlwc2VXaXphcmRQYWdlLmlzUGFnZUNvbXBsZXRlKCkpOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsgfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsNCisJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQorCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7DQorCQkJCXRyeSB7CQkJCQ0KKwkJCQkJY3JlYXRlSGVscGVyKG1vbml0b3IpOw0KKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7DQorCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQl9IGZpbmFsbHkgew0KKwkJCQkJbW9uaXRvci5kb25lKCk7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKwkJdHJ5IHsNCisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcCk7DQorCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIZWxwZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQorCQlIZWxwZXJJbmZvIGhlbHBlckluZm8gPSBjcmVhdGVIZWxwZXJJbmZvKCk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oaGVscGVySW5mby50b1N0cmluZygpKTsNCisJCUhlbHBlckdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgSGVscGVyR2VuZXJhdG9yKGhlbHBlckluZm8pOw0KKwkJZ2VuZXJhdG9yLnJ1bihtb25pdG9yLCBFeHRlbnNpb25Qb2ludEluZm8uU0lOR0xFRklMVEVSLCBFeHRlbnNpb25Qb2ludEluZm8uU0lOR0xFRklMVEVSX0VYVEVOU0lPTl9QT0lOVCk7DQorCX0NCisNCisJcHJpdmF0ZSBIZWxwZXJJbmZvIGNyZWF0ZUhlbHBlckluZm8oKSB7DQorCQlTdHJpbmcgbmFtZSA9IGJhc2ljc1dpemFyZFBhZ2UuZ2V0SGVscGVyTmFtZSgpOw0KKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gYmFzaWNzV2l6YXJkUGFnZS5nZXRIZWxwZXJEZXNjcmlwdGlvbigpOw0KKwkJU3RyaW5nIGlkID0gZWNsaXBzZVdpemFyZFBhZ2UuZ2V0SWQoKTsNCisJCVN0cmluZyBuYW1lc3BhY2VVcmkgPSBtZXRhTW9kZWxXaXphcmRQYWdlLmdldE5hbWVzcGFjZVVyaSgpOw0KKwkJU3RyaW5nIGNsYXNzTmFtZSA9IGJhc2ljc1dpemFyZFBhZ2UuZ2V0Q2xhc3NOYW1lKCk7DQorCQlTdHJpbmcgamFyRmlsZSA9IG1ldGFNb2RlbFdpemFyZFBhZ2UuZ2V0SmFyRmlsZU5hbWUoKTsNCisJCVN0cmluZyBpbnB1dFR5cGUgPSBtZXRhTW9kZWxXaXphcmRQYWdlLmdldElucHV0VHlwZU5hbWUoKTsNCisJCVN0cmluZyBvdXRwdXRUeXBlID0gbWV0YU1vZGVsV2l6YXJkUGFnZS5nZXRPdXRwdXRUeXBlTmFtZSgpOw0KKwkJU3RyaW5nIHByb2plY3ROYW1lID0gZWNsaXBzZVdpemFyZFBhZ2UuZ2V0UHJvamVjdE5hbWUoKTsNCisJCXJldHVybiBuZXcgSGVscGVySW5mbyhuYW1lLCBkZXNjcmlwdGlvbiwgaWQsIG5hbWVzcGFjZVVyaSwgY2xhc3NOYW1lLCANCisJCQkJCQkJCWphckZpbGUsIGlucHV0VHlwZSwgb3V0cHV0VHlwZSwgcHJvamVjdE5hbWUpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL3JlZmFjdG9yaW5nL3dpemFyZHMvUmVmYWN0b3JpbmdXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL3JlZmFjdG9yaW5nL3dpemFyZHMvUmVmYWN0b3JpbmdXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRiMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvcmVmYWN0b3Jpbmcvd2l6YXJkcy9SZWZhY3RvcmluZ1dpemFyZC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgY29tcmVsLmdlbmVyYXRvci5yZWZhY3RvcmluZy53aXphcmRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOw0KKw0KK3B1YmxpYyBjbGFzcyBSZWZhY3RvcmluZ1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgew0KKw0KKwlwdWJsaWMgUmVmYWN0b3JpbmdXaXphcmQoKSB7DQorCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWINCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQorCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQorDQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7DQorCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3Ivc3JjL2NvbXJlbC9nZW5lcmF0b3IvcmVmYWN0b3Jpbmcvd2l6YXJkcy9SZWZhY3RvcmluZ1dpemFyZFBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL3JlZmFjdG9yaW5nL3dpemFyZHMvUmVmYWN0b3JpbmdXaXphcmRQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkYjllYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3NyYy9jb21yZWwvZ2VuZXJhdG9yL3JlZmFjdG9yaW5nL3dpemFyZHMvUmVmYWN0b3JpbmdXaXphcmRQYWdlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBjb21yZWwuZ2VuZXJhdG9yLnJlZmFjdG9yaW5nLndpemFyZHM7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQorDQorcHVibGljIGNsYXNzIFJlZmFjdG9yaW5nV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2Ugew0KKw0KKwkvKioNCisJICogQ3JlYXRlIHRoZSB3aXphcmQuDQorCSAqLw0KKwlwdWJsaWMgUmVmYWN0b3JpbmdXaXphcmRQYWdlKCkgew0KKwkJc3VwZXIoIndpemFyZFBhZ2UiKTsNCisJCXNldFRpdGxlKCJXaXphcmQgUGFnZSB0aXRsZSIpOw0KKwkJc2V0RGVzY3JpcHRpb24oIldpemFyZCBQYWdlIGRlc2NyaXB0aW9uIik7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZSBjb250ZW50cyBvZiB0aGUgd2l6YXJkLg0KKwkgKiBAcGFyYW0gcGFyZW50DQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOw0KKw0KKwkJc2V0Q29udHJvbChjb250YWluZXIpOw0KKwkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOw0KKwkJDQorCQlMYWJlbCBsYmxFY2xpcHNlUGx1Z2luUHJvamVjdCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsNCisJCWxibEVjbGlwc2VQbHVnaW5Qcm9qZWN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7DQorCQlsYmxFY2xpcHNlUGx1Z2luUHJvamVjdC5zZXRUZXh0KCJFY2xpcHNlIHBsdWctaW4gcHJvamVjdDoiKTsNCisJCQ0KKwkJQ29tYm8gY29tYm9Qcm9qZWN0ID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULk5PTkUpOw0KKwkJY29tYm9Qcm9qZWN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSkpOw0KKwkJDQorCQlMYWJlbCBsYmxOZXdMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsNCisJCQ0KKwkJTGFiZWwgbGJsQ29tcmVsTW9kZWxGaWxlID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOw0KKwkJbGJsQ29tcmVsTW9kZWxGaWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7DQorCQlsYmxDb21yZWxNb2RlbEZpbGUuc2V0VGV4dCgiQ29NUmVMIG1vZGVsIGZpbGU6Iik7DQorCQkNCisJCUNvbWJvIGNvbWJvRmlsZSA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5OT05FKTsNCisJCWNvbWJvRmlsZS5zZXRFbmFibGVkKGZhbHNlKTsNCisJCWNvbWJvRmlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsNCisJCQ0KKwkJQnV0dG9uIGJ0bkltcG9ydCA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSk7DQorCQlidG5JbXBvcnQuc2V0RW5hYmxlZChmYWxzZSk7DQorCQlidG5JbXBvcnQuc2V0VGV4dCgiaW1wb3J0Iik7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvdGVtcGxhdGVzL211bHRpZmVhdHVyZS5qYXZhamV0IGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvdGVtcGxhdGVzL211bHRpZmVhdHVyZS5qYXZhamV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjZhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci90ZW1wbGF0ZXMvbXVsdGlmZWF0dXJlLmphdmFqZXQKQEAgLTAsMCArMSw4OCBAQAorPCVAIGpldCBwYWNrYWdlPSJjb21yZWwuaGVscGVyIiBjbGFzcz0iTXVsdGlGZWF0dXJlIg0KK2ltcG9ydHM9ImNvbXJlbC5nZW5lcmF0b3IuaGVscGVyLioiJT4NCis8JUhlbHBlckluZm8gaGVscGVySW5mbyA9IChIZWxwZXJJbmZvKSBhcmd1bWVudDsgJT4NCisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqLw0KK3BhY2thZ2UgPCU9aGVscGVySW5mby5nZXRQYWNrYWdlTmFtZSgpJT47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5leHRlbnNpb25zLklNdWx0aUZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlPdXRwdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEhlbHBlciBjbGFzcyBmb3Igc3luY2hyb25pemluZyBwb3J0cyBpbiANCisgKiBjb21wb3NpdGUgbW9kZWwgcmVmYWN0b3JpbmdzIHNwZWNpZmllZCBpbiBDb01SZUwuDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyA8JT1oZWxwZXJJbmZvLmdldENsYXNzTmFtZSgpJT4gaW1wbGVtZW50cyBJTXVsdGlGZWF0dXJlSGVscGVyIHsNCisNCisJZmluYWwgQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCXByaXZhdGUgU2luZ2xlSW5wdXRQb3J0IDwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSU+Ow0KKwlwcml2YXRlIE11bHRpT3V0cHV0UG9ydCA8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgInMiJT47DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgPCU9aGVscGVySW5mby5nZXRDbGFzc05hbWUoKSU+KCkgew0KKwkJaW5pdElucHV0UG9ydCgpOw0KKwkJaW5pdE91dHB1dFBvcnQoKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIE1ldGhvZCBmb3Igc2V0dGluZyB0aGUgaW5wdXQgcG9ydC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGluaXRJbnB1dFBvcnQoKSB7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCklPiA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCk7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCklPi5zZXROYW1lKCI8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCklPiIpOw0KKwkJPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpJT4uc2V0VHlwZSg8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4uY2xhc3MpOw0KKwl9DQorCQ0KKwkvKioNCisJICogTWV0aG9kIGZvciBzZXR0aW5nIHRoZSBvdXRwdXQgcG9ydC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGluaXRPdXRwdXRQb3J0KCl7DQorCQk8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgInMiJT4gPSBmYWN0b3J5LmNyZWF0ZU11bHRpT3V0cHV0UG9ydCgpOw0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJzIiU+LnNldE5hbWUoIjwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZVZhcmlhYmxlKCkgKyAicyIlPiIpOw0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJzIiU+LnNldFR5cGUoPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlKCklPi5jbGFzcyk7DQorCX0NCisJDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFNpbmdsZUlucHV0UG9ydCBnZXRJbnB1dFBvcnQoKSB7DQorCQlyZXR1cm4gPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpJT47DQorCX0NCisNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKSB7DQorCQlyZXR1cm4gPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJzIiU+Ow0KKwl9DQorCQ0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCTwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlKCklPiBpbiA9ICg8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4pIDwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSU+LmdldFZhbHVlKCk7DQorCQlFTGlzdDw8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGUoKSU+PiBvdXQgPSBuZXcgQmFzaWNFTGlzdDw8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGUoKSU+PigpOw0KKwkJDQorCQkvLyBUT0RPIGltcGxlbWVudCBsb2dpYyAoZmlsbCAnb3V0JykNCisJCQ0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJzIiU+LmdldFZhbHVlKCkuYWRkQWxsKG91dCk7DQorCX0NCisNCit9DQorCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3RlbXBsYXRlcy9tdWx0aWZpbHRlci5qYXZhamV0IGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvdGVtcGxhdGVzL211bHRpZmlsdGVyLmphdmFqZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3M2U3MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3RlbXBsYXRlcy9tdWx0aWZpbHRlci5qYXZhamV0CkBAIC0wLDAgKzEsMTAxIEBACis8JUAgamV0IHBhY2thZ2U9ImNvbXJlbC5oZWxwZXIiIGNsYXNzPSJNdWx0aUZpbHRlciINCitpbXBvcnRzPSJjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci4qIiU+DQorPCVIZWxwZXJJbmZvIGhlbHBlckluZm8gPSAoSGVscGVySW5mbykgYXJndW1lbnQ7ICU+DQorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKi8NCitwYWNrYWdlIDwlPWhlbHBlckluZm8uZ2V0UGFja2FnZU5hbWUoKSU+Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuZXh0ZW5zaW9ucy5JTXVsdGlGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLk11bHRpT3V0cHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQorDQorLyoqDQorICogSGVscGVyIGNsYXNzIGZvciBzeW5jaHJvbml6aW5nIHBvcnRzIGluIA0KKyAqIGNvbXBvc2l0ZSBtb2RlbCByZWZhY3RvcmluZ3Mgc3BlY2lmaWVkIGluIENvTVJlTC4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIDwlPWhlbHBlckluZm8uZ2V0Q2xhc3NOYW1lKCklPiBpbXBsZW1lbnRzIElNdWx0aUZpbHRlckhlbHBlciB7DQorDQorCWZpbmFsIENvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwlwcml2YXRlIE11bHRpSW5wdXRQb3J0IDwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSArICJpbiIlPjsNCisJcHJpdmF0ZSBNdWx0aU91dHB1dFBvcnQgPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJvdXQiJT47DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgPCU9aGVscGVySW5mby5nZXRDbGFzc05hbWUoKSU+KCkgew0KKwkJaW5pdElucHV0UG9ydCgpOw0KKwkJaW5pdE91dHB1dFBvcnQoKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIE1ldGhvZCBmb3Igc2V0dGluZyB0aGUgaW5wdXQgcG9ydC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGluaXRJbnB1dFBvcnQoKSB7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAiaW4iJT4gPSBmYWN0b3J5LmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAiaW4iJT4uc2V0TmFtZSgiPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpICsgImluIiU+Iik7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAiaW4iJT4uc2V0VHlwZSg8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4uY2xhc3MpOw0KKwl9DQorCQ0KKwkvKioNCisJICogTWV0aG9kIGZvciBzZXR0aW5nIHRoZSBvdXRwdXQgcG9ydC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGluaXRPdXRwdXRQb3J0KCl7DQorCQk8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPiA9IGZhY3RvcnkuY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCk7DQorCQk8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPi5zZXROYW1lKCI8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPiIpOw0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJvdXQiJT4uc2V0VHlwZSg8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGUoKSU+LmNsYXNzKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCkgew0KKwkJcmV0dXJuIDwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSArICJpbiIlPjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBNdWx0aU91dHB1dFBvcnQgZ2V0T3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiA8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPjsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQlFTGlzdDw8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4+IGluID0gc2V0SW5wdXQoKTsNCisJCUVMaXN0PDwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZSgpJT4+IG91dCA9IG5ldyBCYXNpY0VMaXN0PDwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZSgpJT4+KCk7DQorCQkNCisJCS8vIFRPRE8gaW1wbGVtZW50IGxvZ2ljIChmaWxsICdvdXQnKQ0KKwkJDQorCQk8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPi5nZXRWYWx1ZSgpLmFkZEFsbChvdXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBIZWxwZXIgbWV0aG9kIGZvciBleHRyYWN0aW5nIGlucHV0IHRvIEphdmEgb2JqZWN0cy4gDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUxpc3Q8PCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGUoKSU+PiBzZXRJbnB1dCgpIHsNCisJCUVMaXN0PE9iamVjdD4gb3JpZ2luID0gPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpICsgImluIiU+LmdldFZhbHVlKCk7DQorCQlFTGlzdDw8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4+IGluID0gbmV3IEJhc2ljRUxpc3Q8PCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGUoKSU+PigpOw0KKwkJZm9yIChPYmplY3QgbyA6IG9yaWdpbikgew0KKwkJCWluLmFkZCgoPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGUoKSU+KSBvKTsNCisJCX0NCisJCXJldHVybiBpbjsNCisJfQ0KKw0KK30NCisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5nZW5lcmF0b3IvdGVtcGxhdGVzL3NpbmdsZWZlYXR1cmUuamF2YWpldCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3RlbXBsYXRlcy9zaW5nbGVmZWF0dXJlLmphdmFqZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2NmQ3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3RlbXBsYXRlcy9zaW5nbGVmZWF0dXJlLmphdmFqZXQKQEAgLTAsMCArMSw4NSBAQAorPCVAIGpldCBwYWNrYWdlPSJjb21yZWwuaGVscGVyIiBjbGFzcz0iU2luZ2xlRmVhdHVyZSINCitpbXBvcnRzPSJjb21yZWwuZ2VuZXJhdG9yLmhlbHBlci4qIiU+DQorPCVIZWxwZXJJbmZvIGhlbHBlckluZm8gPSAoSGVscGVySW5mbykgYXJndW1lbnQ7ICU+DQorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKi8NCitwYWNrYWdlIDwlPWhlbHBlckluZm8uZ2V0UGFja2FnZU5hbWUoKSU+Ow0KKw0KK2ltcG9ydCBjb21yZWwuZXh0ZW5zaW9ucy5JU2luZ2xlRmVhdHVyZUhlbHBlcjsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVPdXRwdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEhlbHBlciBjbGFzcyBmb3Igc3luY2hyb25pemluZyBwb3J0cyBpbiANCisgKiBjb21wb3NpdGUgbW9kZWwgcmVmYWN0b3JpbmdzIHNwZWNpZmllZCBpbiBDb01SZUwuDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyA8JT1oZWxwZXJJbmZvLmdldENsYXNzTmFtZSgpJT4gaW1wbGVtZW50cyBJU2luZ2xlRmVhdHVyZUhlbHBlciB7DQorDQorCWZpbmFsIENvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwlwcml2YXRlIFNpbmdsZUlucHV0UG9ydCA8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAiaW4iJT47DQorCXByaXZhdGUgU2luZ2xlT3V0cHV0UG9ydCA8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPjsNCisNCisJLyoqDQorCSAqIERlZmF1bHQgY29uc3RydWN0b3IuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyA8JT1oZWxwZXJJbmZvLmdldENsYXNzTmFtZSgpJT4oKSB7DQorCQlpbml0SW5wdXRQb3J0KCk7DQorCQlpbml0T3V0cHV0UG9ydCgpOw0KKwl9DQorCQ0KKwkvKioNCisJICogTWV0aG9kIGZvciBzZXR0aW5nIHRoZSBpbnB1dCBwb3J0Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgaW5pdElucHV0UG9ydCgpIHsNCisJCTwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSArICJpbiIlPiA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCk7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAiaW4iJT4uc2V0TmFtZSgiPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpICsgImluIiU+Iik7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAiaW4iJT4uc2V0VHlwZSg8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4uY2xhc3MpOw0KKwl9DQorCQ0KKwkvKioNCisJICogTWV0aG9kIGZvciBzZXR0aW5nIHRoZSBvdXRwdXQgcG9ydC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGluaXRPdXRwdXRQb3J0KCl7DQorCQk8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPiA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlT3V0cHV0UG9ydCgpOw0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJvdXQiJT4uc2V0TmFtZSgiPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSArICJvdXQiJT4iKTsNCisJCTwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZVZhcmlhYmxlKCkgKyAib3V0IiU+LnNldFR5cGUoPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlKCklPi5jbGFzcyk7DQorCX0NCisJDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFNpbmdsZUlucHV0UG9ydCBnZXRJbnB1dFBvcnQoKSB7DQorCQlyZXR1cm4gPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpICsgImluIiU+Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnQgZ2V0T3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiA8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPjsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBydW4oKSB7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4gaW4gPSAoPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGUoKSU+KSA8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAiaW4iJT4uZ2V0VmFsdWUoKTsNCisJCTwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZSgpJT4gb3V0ID0gbnVsbDsNCisJCQ0KKwkJLy8gVE9ETyBpbXBsZW1lbnQgbG9naWMgKHJlcGxhY2UgJ251bGwnKQ0KKwkJDQorCQk8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpICsgIm91dCIlPi5zZXRWYWx1ZShvdXQpOw0KKwl9DQorDQorfQ0KKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci90ZW1wbGF0ZXMvc2luZ2xlZmlsdGVyLmphdmFqZXQgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmdlbmVyYXRvci90ZW1wbGF0ZXMvc2luZ2xlZmlsdGVyLmphdmFqZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlYWJmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuZ2VuZXJhdG9yL3RlbXBsYXRlcy9zaW5nbGVmaWx0ZXIuamF2YWpldApAQCAtMCwwICsxLDEwMSBAQAorPCVAIGpldCBwYWNrYWdlPSJjb21yZWwuaGVscGVyIiBjbGFzcz0iU2luZ2xlRmlsdGVyIg0KK2ltcG9ydHM9ImNvbXJlbC5nZW5lcmF0b3IuaGVscGVyLioiJT4NCis8JUhlbHBlckluZm8gaGVscGVySW5mbyA9IChIZWxwZXJJbmZvKSBhcmd1bWVudDsgJT4NCisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqLw0KK3BhY2thZ2UgPCU9aGVscGVySW5mby5nZXRQYWNrYWdlTmFtZSgpJT47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5leHRlbnNpb25zLklTaW5nbGVGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVPdXRwdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEhlbHBlciBjbGFzcyBmb3Igc3luY2hyb25pemluZyBwb3J0cyBpbiANCisgKiBjb21wb3NpdGUgbW9kZWwgcmVmYWN0b3JpbmdzIHNwZWNpZmllZCBpbiBDb01SZUwuDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyA8JT1oZWxwZXJJbmZvLmdldENsYXNzTmFtZSgpJT4gaW1wbGVtZW50cyBJU2luZ2xlRmlsdGVySGVscGVyIHsNCisNCisJZmluYWwgQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCXByaXZhdGUgTXVsdGlJbnB1dFBvcnQgPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpICsgInMiJT47DQorCXByaXZhdGUgU2luZ2xlT3V0cHV0UG9ydCA8JT1oZWxwZXJJbmZvLmdldE91dHB1dFR5cGVWYXJpYWJsZSgpJT47DQorDQorCS8qKg0KKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgPCU9aGVscGVySW5mby5nZXRDbGFzc05hbWUoKSU+KCkgew0KKwkJaW5pdElucHV0UG9ydCgpOw0KKwkJaW5pdE91dHB1dFBvcnQoKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIE1ldGhvZCBmb3Igc2V0dGluZyB0aGUgaW5wdXQgcG9ydC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSB2b2lkIGluaXRJbnB1dFBvcnQoKSB7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAicyIlPiA9IGZhY3RvcnkuY3JlYXRlTXVsdGlJbnB1dFBvcnQoKTsNCisJCTwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSArICJzIiU+LnNldE5hbWUoIjwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlVmFyaWFibGUoKSArICJzIiU+Iik7DQorCQk8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAicyIlPi5zZXRUeXBlKDwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlKCklPi5jbGFzcyk7DQorCX0NCisJDQorCS8qKg0KKwkgKiBNZXRob2QgZm9yIHNldHRpbmcgdGhlIG91dHB1dCBwb3J0Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIHZvaWQgaW5pdE91dHB1dFBvcnQoKXsNCisJCTwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZVZhcmlhYmxlKCklPiA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlT3V0cHV0UG9ydCgpOw0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSU+LnNldE5hbWUoIjwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZVZhcmlhYmxlKCklPiIpOw0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSU+LnNldFR5cGUoPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlKCklPi5jbGFzcyk7DQorCX0NCisJDQorCS8qKg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE11bHRpSW5wdXRQb3J0IGdldElucHV0UG9ydCgpIHsNCisJCXJldHVybiA8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZVZhcmlhYmxlKCkgKyAicyIlPjsNCisJfQ0KKw0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKSB7DQorCQlyZXR1cm4gPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlVmFyaWFibGUoKSU+Ow0KKwl9DQorCQ0KKwkvKioNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIHJ1bigpIHsNCisJCUVMaXN0PDwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlKCklPj4gaW4gPSBzZXRJbnB1dCgpOw0KKwkJPCU9aGVscGVySW5mby5nZXRPdXRwdXRUeXBlKCklPiBvdXQgPSBudWxsOw0KKwkJDQorCQkvLyBUT0RPIGltcGxlbWVudCBsb2dpYyAocmVwbGFjZSAnbnVsbCcpDQorCQkNCisJCTwlPWhlbHBlckluZm8uZ2V0T3V0cHV0VHlwZVZhcmlhYmxlKCklPi5zZXRWYWx1ZShvdXQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBIZWxwZXIgbWV0aG9kIGZvciBleHRyYWN0aW5nIGlucHV0IHRvIEphdmEgb2JqZWN0cy4gDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUxpc3Q8PCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGUoKSU+PiBzZXRJbnB1dCgpIHsNCisJCUVMaXN0PE9iamVjdD4gb3JpZ2luID0gPCU9aGVscGVySW5mby5nZXRJbnB1dFR5cGVWYXJpYWJsZSgpICsgInMiJT4uZ2V0VmFsdWUoKTsNCisJCUVMaXN0PDwlPWhlbHBlckluZm8uZ2V0SW5wdXRUeXBlKCklPj4gaW4gPSBuZXcgQmFzaWNFTGlzdDw8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4+KCk7DQorCQlmb3IgKE9iamVjdCBvIDogb3JpZ2luKSB7DQorCQkJaW4uYWRkKCg8JT1oZWxwZXJJbmZvLmdldElucHV0VHlwZSgpJT4pIG8pOw0KKwkJfQ0KKwkJcmV0dXJuIGluOw0KKwl9DQorDQorfQ0KKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4ZjE2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGNsYXNzcGF0aD4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS42Ii8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzOWUyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyPC9uYW1lPg0KKwk8Y29tbWVudD48L2NvbW1lbnQ+DQorCTxwcm9qZWN0cz4NCisJPC9wcm9qZWN0cz4NCisJPGJ1aWxkU3BlYz4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwk8L2J1aWxkU3BlYz4NCisJPG5hdHVyZXM+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2M1MTY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw4IEBACisjV2VkIFNlcCAyMSAxMjoyMjoyMyBDRVNUIDIwMTENCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS42DQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjYNCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTQ5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjEgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6IENvTVJlTCBJbnRlcnByZXRlcgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlcjtzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAwLjkuMAorQnVuZGxlLUFjdGl2YXRvcjogY29tcmVsLmludGVycHJldGVyLkFjdGl2YXRvcgorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IjIuNi4xIiwKKyBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iMy41LjEwMCIsCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNi4wIiwKKyBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsO2J1bmRsZS12ZXJzaW9uPSIwLjguMCIsCisgb3JnLmVjbGlwc2UudW1sMi51bWw7YnVuZGxlLXZlcnNpb249IjMuMS4xIiwKKyBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IjAuNy4wIiwKKyBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcucnVudGltZTtidW5kbGUtdmVyc2lvbj0iMC43LjAiCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjYKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UudXRpbCwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwKK0V4cG9ydC1QYWNrYWdlOiBjb21yZWwuaW50ZXJwcmV0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvYmluLy5naXRpZ25vcmUgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL2Jpbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGRiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL2Jpbi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKy9jb21yZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ1ZDAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNyBAQAorc291cmNlLi4gPSBzcmMvDQorb3V0cHV0Li4gPSBiaW4vDQorYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCisgICAgICAgICAgICAgICAuLFwNCisgICAgICAgICAgICAgICBzcmMvLFwNCisgICAgICAgICAgICAgICBiaW4vLFwNCisgICAgICAgICAgICAgICBtb2RlbHMvDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9tb2RlbHMvTXkudW1sIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9tb2RlbHMvTXkudW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDUzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL21vZGVscy9NeS51bWwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzx1bWw6TW9kZWwgeG1pOnZlcnNpb249IjIuMSIgeG1sbnM6eG1pPSJodHRwOi8vc2NoZW1hLm9tZy5vcmcvc3BlYy9YTUkvMi4xIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8zLjAuMC9VTUwiIHhtaTppZD0iXzZrMTlJT05mRWVDRVBjeVFrbF8wUVEiIG5hbWU9InRlc3Rtb2RlbCI+DQorICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfLWdfcG9PTmZFZUNFUGN5UWtsXzBRUSIgbmFtZT0ibXlwYWNrYWdlIj4NCisgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9CSGtxVU9OZ0VlQ0VQY3lRa2xfMFFRIiBuYW1lPSJNeUNsYXNzIj4NCisgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfRFhJU0lPTmdFZUNFUGN5UWtsXzBRUSIgbmFtZT0ibXlhdHRyaWJ1dGUiLz4NCisgICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJfZ3VPZVFPTjhFZUNFUGN5UWtsXzBRUSIgbmFtZT0ib3AiLz4NCisgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQorICA8L3BhY2thZ2VkRWxlbWVudD4NCis8L3VtbDpNb2RlbD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL21vZGVscy9leHRyYWN0c3VwZXJjbGFzcy5jb21yZWwgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL21vZGVscy9leHRyYWN0c3VwZXJjbGFzcy5jb21yZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiMjc0NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvbW9kZWxzL2V4dHJhY3RzdXBlcmNsYXNzLmNvbXJlbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjb21yZWw6Q29tcG9zaXRlUmVmYWN0b3JpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpjb21yZWw9Imh0dHA6Ly9jb21yZWwvMC4xIiBuYW1lPSJFeHRyYWN0U3VwZXJjbGFzcyIgcmVmSWQ9ImNvbXJlbC5leHRyYWN0c3VwZXJjbGFzcyIgbGFiZWw9IkV4dHJhY3RTdXBlcmNsYXNzIiBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8zLjAuMC9VTUwiPg0KKyAgPG1haW5SZWZhY3RvcmluZ1VuaXQgeHNpOnR5cGU9ImNvbXJlbDpTZXF1ZW50aWFsVW5pdCIgbmFtZT0iRXh0cmFjdFN1cGVyY2xhc3MiPg0KKyAgICA8aGVscGVyVW5pdHMgeHNpOnR5cGU9ImNvbXJlbDpTaW5nbGVGaWx0ZXJVbml0IiBuYW1lPSJHZXRGaXJzdENsYXNzIiBoZWxwZXJVbml0SWQ9ImNvbXJlbC5nZXRmaXJzdGNsYXNzIiBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8zLjAuMC9VTUwiIHNpbmdsZUZpbHRlckhlbHBlcj0iLy9AaGVscGVyLjAiPg0KKyAgICAgIDxpbnB1dFBvcnQgbmFtZT0iY2xhc3NlcyIgdHlwZT0ib3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MiLz4NCisgICAgICA8b3V0cHV0UG9ydCBuYW1lPSJ1bWxjbGFzcyIgdHlwZT0ib3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MiLz4NCisgICAgPC9oZWxwZXJVbml0cz4NCisgICAgPGhlbHBlclVuaXRzIHhzaTp0eXBlPSJjb21yZWw6TXVsdGlGZWF0dXJlVW5pdCIgbmFtZT0iR2V0T3duZWRBdHRyaWJ1dGVzIiBoZWxwZXJVbml0SWQ9ImNvbXJlbC5nZXRvd25lZGF0dHJpYnV0ZXMiIG5hbWVzcGFjZVVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzMuMC4wL1VNTCIgbXVsdGlGZWF0dXJlSGVscGVyPSIvL0BoZWxwZXIuMSI+DQorICAgICAgPGlucHV0UG9ydCBuYW1lPSJ1bWxjbGFzcyIgdHlwZT0ib3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MiLz4NCisgICAgICA8b3V0cHV0UG9ydCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5Qcm9wZXJ0eSIvPg0KKyAgICA8L2hlbHBlclVuaXRzPg0KKyAgICA8aGVscGVyVW5pdHMgeHNpOnR5cGU9ImNvbXJlbDpNdWx0aUZlYXR1cmVVbml0IiBuYW1lPSJHZXRPd25lZE9wZXJhdGlvbnMiIGhlbHBlclVuaXRJZD0iY29tcmVsLmdldG93bmVkb3BlcmF0aW9ucyIgbmFtZXNwYWNlVXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMy4wLjAvVU1MIiBtdWx0aUZlYXR1cmVIZWxwZXI9Ii8vQGhlbHBlci4yIj4NCisgICAgICA8aW5wdXRQb3J0IG5hbWU9InVtbGNsYXNzIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyIvPg0KKyAgICAgIDxvdXRwdXRQb3J0IG5hbWU9Im9wZXJhdGlvbnMiIHR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudW1sLk9wZXJhdGlvbiIvPg0KKyAgICA8L2hlbHBlclVuaXRzPg0KKyAgICA8cmVmYWN0b3JpbmdVbml0cyB4c2k6dHlwZT0iY29tcmVsOlNpbmdsZVF1ZXVlZFVuaXQiIG5hbWU9IkNyZWF0ZVN1cGVyY2xhc3MiIHNlcUV4ZWN1dGlvbk9yZGVyPSIxIj4NCisgICAgICA8cmVmYWN0b3JpbmdVbml0IHhzaTp0eXBlPSJjb21yZWw6QXRvbWljVW5pdCIgbmFtZT0iQ3JlYXRlU3VwZXJjbGFzcyIgdW5pdElkPSJjb21yZWwuY3JlYXRlc3VwZXJjbGFzcyIgbGFiZWw9IkNyZWF0ZVN1cGVyY2xhc3MiIG5hbWVzcGFjZVVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzMuMC4wL1VNTCIgbW9kZWxSZWZhY3RvcmluZz0iLy9AbW9kZWxSZWZhY3RvcmluZ3MuMCI+DQorICAgICAgICA8aW5wdXRQb3J0cyBuYW1lPSJjbGFzc25hbWUiIGRlc2NyaXB0aW9uPSIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4NCisgICAgICAgIDxpbnB1dFBvcnRzIG5hbWU9InNlbGVjdGVkRU9iamVjdCIgZGVzY3JpcHRpb249IiIgdHlwZT0ib3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MiLz4NCisgICAgICA8L3JlZmFjdG9yaW5nVW5pdD4NCisgICAgICA8c2luZ2xlSW5wdXRQb3J0cyBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4NCisgICAgICA8bXVsdGlJbnB1dFBvcnQgbmFtZT0iY2xhc3NlcyIgdHlwZT0ib3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MiLz4NCisgICAgPC9yZWZhY3RvcmluZ1VuaXRzPg0KKyAgICA8cmVmYWN0b3JpbmdVbml0cyB4c2k6dHlwZT0iY29tcmVsOlNpbmdsZVF1ZXVlZFVuaXQiIG5hbWU9IlB1bGxVcEF0dHJpYnV0ZXMiIHNlcUV4ZWN1dGlvbk9yZGVyPSIyIiBzdHJpY3Q9ImZhbHNlIiBsYmxTdHJpY3Q9Im5vbiBzdHJpY3QiPg0KKyAgICAgIDxyZWZhY3RvcmluZ1VuaXQgeHNpOnR5cGU9ImNvbXJlbDpBdG9taWNVbml0IiBuYW1lPSJQdWxsVXBBdHRyaWJ1dGUiIHVuaXRJZD0iY29tcmVsLnB1bGx1cGF0dHJpYnV0ZSIgbGFiZWw9IlB1bGxVcEF0dHJpYnV0ZSIgbmFtZXNwYWNlVXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMy4wLjAvVU1MIiBtb2RlbFJlZmFjdG9yaW5nPSIvL0Btb2RlbFJlZmFjdG9yaW5ncy4xIj4NCisgICAgICAgIDxpbnB1dFBvcnRzIG5hbWU9ImNsYXNzbmFtZSIgZGVzY3JpcHRpb249IiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPg0KKyAgICAgICAgPGlucHV0UG9ydHMgbmFtZT0ic2VsZWN0ZWRFT2JqZWN0IiBkZXNjcmlwdGlvbj0iIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5Qcm9wZXJ0eSIvPg0KKyAgICAgIDwvcmVmYWN0b3JpbmdVbml0Pg0KKyAgICAgIDxzaW5nbGVJbnB1dFBvcnRzIG5hbWU9ImNsYXNzbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPg0KKyAgICAgIDxtdWx0aUlucHV0UG9ydCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5Qcm9wZXJ0eSIvPg0KKyAgICA8L3JlZmFjdG9yaW5nVW5pdHM+DQorICAgIDxyZWZhY3RvcmluZ1VuaXRzIHhzaTp0eXBlPSJjb21yZWw6U2luZ2xlUXVldWVkVW5pdCIgbmFtZT0iUHVsbFVwT3BlcmF0aW9ucyIgc2VxRXhlY3V0aW9uT3JkZXI9IjMiIHN0cmljdD0iZmFsc2UiIGxibFN0cmljdD0ibm9uIHN0cmljdCI+DQorICAgICAgPHJlZmFjdG9yaW5nVW5pdCB4c2k6dHlwZT0iY29tcmVsOkF0b21pY1VuaXQiIG5hbWU9IlB1bGxVcE9wZXJhdGlvbiIgdW5pdElkPSJjb21yZWwucHVsbHVwb3BlcmF0aW9uIiBsYWJlbD0iUHVsbFVwT3BlcmF0aW9uIiBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8zLjAuMC9VTUwiIG1vZGVsUmVmYWN0b3Jpbmc9Ii8vQG1vZGVsUmVmYWN0b3JpbmdzLjIiPg0KKyAgICAgICAgPGlucHV0UG9ydHMgbmFtZT0iY2xhc3NuYW1lIiBkZXNjcmlwdGlvbj0iIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+DQorICAgICAgICA8aW5wdXRQb3J0cyBuYW1lPSJzZWxlY3RlZEVPYmplY3QiIGRlc2NyaXB0aW9uPSIiIHR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudW1sLk9wZXJhdGlvbiIvPg0KKyAgICAgIDwvcmVmYWN0b3JpbmdVbml0Pg0KKyAgICAgIDxzaW5nbGVJbnB1dFBvcnRzIG5hbWU9ImNsYXNzbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPg0KKyAgICAgIDxtdWx0aUlucHV0UG9ydCBuYW1lPSJvcGVyYXRpb25zIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5PcGVyYXRpb24iLz4NCisgICAgPC9yZWZhY3RvcmluZ1VuaXRzPg0KKyAgICA8aW5wdXRQb3J0cyB4c2k6dHlwZT0iY29tcmVsOk11bHRpSW5wdXRQb3J0IiBuYW1lPSJjbGFzc2VzIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyIvPg0KKyAgICA8aW5wdXRQb3J0cyB4c2k6dHlwZT0iY29tcmVsOlNpbmdsZUlucHV0UG9ydCIgbmFtZT0ic3VwZXJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4NCisgIDwvbWFpblJlZmFjdG9yaW5nVW5pdD4NCisgIDxwb3J0TWFwcGluZ3MgeHNpOnR5cGU9ImNvbXJlbDpNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIiBzb3VyY2U9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMC9AbXVsdGlJbnB1dFBvcnQiIHRhcmdldD0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AcmVmYWN0b3JpbmdVbml0cy4wL0ByZWZhY3RvcmluZ1VuaXQvQGlucHV0UG9ydHMuMSIvPg0KKyAgPHBvcnRNYXBwaW5ncyB4c2k6dHlwZT0iY29tcmVsOlNpbmdsZVBvcnRNYXBwaW5nIiBzb3VyY2U9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMC9Ac2luZ2xlSW5wdXRQb3J0cy4wIiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMC9AcmVmYWN0b3JpbmdVbml0L0BpbnB1dFBvcnRzLjAiLz4NCisgIDxwb3J0TWFwcGluZ3MgeHNpOnR5cGU9ImNvbXJlbDpNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIiBzb3VyY2U9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMS9AbXVsdGlJbnB1dFBvcnQiIHRhcmdldD0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AcmVmYWN0b3JpbmdVbml0cy4xL0ByZWZhY3RvcmluZ1VuaXQvQGlucHV0UG9ydHMuMSIvPg0KKyAgPHBvcnRNYXBwaW5ncyB4c2k6dHlwZT0iY29tcmVsOlNpbmdsZVBvcnRNYXBwaW5nIiBzb3VyY2U9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMS9Ac2luZ2xlSW5wdXRQb3J0cy4wIiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMS9AcmVmYWN0b3JpbmdVbml0L0BpbnB1dFBvcnRzLjAiLz4NCisgIDxwb3J0TWFwcGluZ3MgeHNpOnR5cGU9ImNvbXJlbDpNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIiBzb3VyY2U9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMi9AbXVsdGlJbnB1dFBvcnQiIHRhcmdldD0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AcmVmYWN0b3JpbmdVbml0cy4yL0ByZWZhY3RvcmluZ1VuaXQvQGlucHV0UG9ydHMuMSIvPg0KKyAgPHBvcnRNYXBwaW5ncyB4c2k6dHlwZT0iY29tcmVsOlNpbmdsZVBvcnRNYXBwaW5nIiBzb3VyY2U9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMi9Ac2luZ2xlSW5wdXRQb3J0cy4wIiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMi9AcmVmYWN0b3JpbmdVbml0L0BpbnB1dFBvcnRzLjAiLz4NCisgIDxwb3J0TWFwcGluZ3MgeHNpOnR5cGU9ImNvbXJlbDpNdWx0aVBvcnRNYXBwaW5nIiBzb3VyY2U9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQGlucHV0UG9ydHMuMCIgdGFyZ2V0PSIvL0BtYWluUmVmYWN0b3JpbmdVbml0L0ByZWZhY3RvcmluZ1VuaXRzLjAvQG11bHRpSW5wdXRQb3J0Ii8+DQorICA8cG9ydE1hcHBpbmdzIHhzaTp0eXBlPSJjb21yZWw6TXVsdGlQb3J0TWFwcGluZyIgc291cmNlPSIvL0BtYWluUmVmYWN0b3JpbmdVbml0L0BpbnB1dFBvcnRzLjAiIHRhcmdldD0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AaGVscGVyVW5pdHMuMC9AaW5wdXRQb3J0Ii8+DQorICA8cG9ydE1hcHBpbmdzIHhzaTp0eXBlPSJjb21yZWw6U2luZ2xlUG9ydE1hcHBpbmciIHNvdXJjZT0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AaW5wdXRQb3J0cy4xIiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMS9Ac2luZ2xlSW5wdXRQb3J0cy4wIi8+DQorICA8cG9ydE1hcHBpbmdzIHhzaTp0eXBlPSJjb21yZWw6U2luZ2xlUG9ydE1hcHBpbmciIHNvdXJjZT0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AaW5wdXRQb3J0cy4xIiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMC9Ac2luZ2xlSW5wdXRQb3J0cy4wIi8+DQorICA8cG9ydE1hcHBpbmdzIHhzaTp0eXBlPSJjb21yZWw6U2luZ2xlUG9ydE1hcHBpbmciIHNvdXJjZT0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AaW5wdXRQb3J0cy4xIiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMi9Ac2luZ2xlSW5wdXRQb3J0cy4wIi8+DQorICA8cG9ydE1hcHBpbmdzIHhzaTp0eXBlPSJjb21yZWw6U2luZ2xlUG9ydE1hcHBpbmciIHNvdXJjZT0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AaGVscGVyVW5pdHMuMC9Ab3V0cHV0UG9ydCIgdGFyZ2V0PSIvL0BtYWluUmVmYWN0b3JpbmdVbml0L0BoZWxwZXJVbml0cy4xL0BpbnB1dFBvcnQiLz4NCisgIDxwb3J0TWFwcGluZ3MgeHNpOnR5cGU9ImNvbXJlbDpTaW5nbGVQb3J0TWFwcGluZyIgc291cmNlPSIvL0BtYWluUmVmYWN0b3JpbmdVbml0L0BoZWxwZXJVbml0cy4wL0BvdXRwdXRQb3J0IiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQGhlbHBlclVuaXRzLjIvQGlucHV0UG9ydCIvPg0KKyAgPHBvcnRNYXBwaW5ncyB4c2k6dHlwZT0iY29tcmVsOk11bHRpUG9ydE1hcHBpbmciIHNvdXJjZT0iLy9AbWFpblJlZmFjdG9yaW5nVW5pdC9AaGVscGVyVW5pdHMuMS9Ab3V0cHV0UG9ydCIgdGFyZ2V0PSIvL0BtYWluUmVmYWN0b3JpbmdVbml0L0ByZWZhY3RvcmluZ1VuaXRzLjEvQG11bHRpSW5wdXRQb3J0Ii8+DQorICA8cG9ydE1hcHBpbmdzIHhzaTp0eXBlPSJjb21yZWw6TXVsdGlQb3J0TWFwcGluZyIgc291cmNlPSIvL0BtYWluUmVmYWN0b3JpbmdVbml0L0BoZWxwZXJVbml0cy4yL0BvdXRwdXRQb3J0IiB0YXJnZXQ9Ii8vQG1haW5SZWZhY3RvcmluZ1VuaXQvQHJlZmFjdG9yaW5nVW5pdHMuMi9AbXVsdGlJbnB1dFBvcnQiLz4NCisgIDxtb2RlbFJlZmFjdG9yaW5ncyBuYW1lPSJDcmVhdGVTdXBlcmNsYXNzIiByZWZJZD0iY29tcmVsLmNyZWF0ZXN1cGVyY2xhc3MiIGxhYmVsPSJDcmVhdGVTdXBlcmNsYXNzIiBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8zLjAuMC9VTUwiPg0KKyAgICA8aW5wdXRQb3J0cyBuYW1lPSJjbGFzc25hbWUiIGRlc2NyaXB0aW9uPSIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4NCisgICAgPGlucHV0UG9ydHMgbmFtZT0ic2VsZWN0ZWRFT2JqZWN0IiBkZXNjcmlwdGlvbj0iIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyIvPg0KKyAgPC9tb2RlbFJlZmFjdG9yaW5ncz4NCisgIDxtb2RlbFJlZmFjdG9yaW5ncyBuYW1lPSJQdWxsVXBBdHRyaWJ1dGUiIHJlZklkPSJjb21yZWwucHVsbHVwYXR0cmlidXRlIiBsYWJlbD0iUHVsbFVwQXR0cmlidXRlIiBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8zLjAuMC9VTUwiPg0KKyAgICA8aW5wdXRQb3J0cyBuYW1lPSJjbGFzc25hbWUiIGRlc2NyaXB0aW9uPSIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4NCisgICAgPGlucHV0UG9ydHMgbmFtZT0ic2VsZWN0ZWRFT2JqZWN0IiBkZXNjcmlwdGlvbj0iIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5Qcm9wZXJ0eSIvPg0KKyAgPC9tb2RlbFJlZmFjdG9yaW5ncz4NCisgIDxtb2RlbFJlZmFjdG9yaW5ncyBuYW1lPSJQdWxsVXBPcGVyYXRpb24iIHJlZklkPSJjb21yZWwucHVsbHVwb3BlcmF0aW9uIiBsYWJlbD0iUHVsbFVwT3BlcmF0aW9uIiBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8zLjAuMC9VTUwiPg0KKyAgICA8aW5wdXRQb3J0cyBuYW1lPSJjbGFzc25hbWUiIGRlc2NyaXB0aW9uPSIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4NCisgICAgPGlucHV0UG9ydHMgbmFtZT0ic2VsZWN0ZWRFT2JqZWN0IiBkZXNjcmlwdGlvbj0iIiB0eXBlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5PcGVyYXRpb24iLz4NCisgIDwvbW9kZWxSZWZhY3RvcmluZ3M+DQorICA8aGVscGVyIHhzaTp0eXBlPSJjb21yZWw6U2luZ2xlRmlsdGVySGVscGVyIiBuYW1lPSJHZXRGaXJzdENsYXNzIiBoZWxwZXJJZD0iY29tcmVsLmdldGZpcnN0Y2xhc3MiIG5hbWVzcGFjZVVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzMuMC4wL1VNTCI+DQorICAgIDxpbnB1dFBvcnQgbmFtZT0iY2xhc3NlcyIgdHlwZT0ib3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3MiLz4NCisgICAgPG91dHB1dFBvcnQgbmFtZT0idW1sY2xhc3MiIHR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIi8+DQorICA8L2hlbHBlcj4NCisgIDxoZWxwZXIgeHNpOnR5cGU9ImNvbXJlbDpNdWx0aUZlYXR1cmVIZWxwZXIiIG5hbWU9IkdldE93bmVkQXR0cmlidXRlcyIgaGVscGVySWQ9ImNvbXJlbC5nZXRvd25lZGF0dHJpYnV0ZXMiIG5hbWVzcGFjZVVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzMuMC4wL1VNTCI+DQorICAgIDxpbnB1dFBvcnQgbmFtZT0idW1sY2xhc3MiIHR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIi8+DQorICAgIDxvdXRwdXRQb3J0IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudW1sLlByb3BlcnR5Ii8+DQorICA8L2hlbHBlcj4NCisgIDxoZWxwZXIgeHNpOnR5cGU9ImNvbXJlbDpNdWx0aUZlYXR1cmVIZWxwZXIiIG5hbWU9IkdldE93bmVkT3BlcmF0aW9ucyIgaGVscGVySWQ9ImNvbXJlbC5nZXRvd25lZG9wZXJhdGlvbnMiIG5hbWVzcGFjZVVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzMuMC4wL1VNTCI+DQorICAgIDxpbnB1dFBvcnQgbmFtZT0idW1sY2xhc3MiIHR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIi8+DQorICAgIDxvdXRwdXRQb3J0IG5hbWU9Im9wZXJhdGlvbnMiIHR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudW1sLk9wZXJhdGlvbiIvPg0KKyAgPC9oZWxwZXI+DQorPC9jb21yZWw6Q29tcG9zaXRlUmVmYWN0b3Jpbmc+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9zcmMvY29tcmVsL2ludGVycHJldGVyL0FjdGl2YXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9zcmMvY29tcmVsL2ludGVycHJldGVyL0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWM3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL3NyYy9jb21yZWwvaW50ZXJwcmV0ZXIvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBjb21yZWwuaW50ZXJwcmV0ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCisNCisvKioNCisgKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCisgKi8NCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7DQorDQorCS8vIFRoZSBwbHVnLWluIElEDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyIjsgLy8kTk9OLU5MUy0xJA0KKw0KKwkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQorCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47DQorCQ0KKwkvKioNCisJICogVGhlIGNvbnN0cnVjdG9yDQorCSAqLw0KKwlwdWJsaWMgQWN0aXZhdG9yKCkgew0KKwl9DQorDQorCS8qDQorCSAqIChub24tSmF2YWRvYykNCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCisJICovDQorCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorCQlzdXBlci5zdGFydChjb250ZXh0KTsNCisJCXBsdWdpbiA9IHRoaXM7DQorCX0NCisNCisJLyoNCisJICogKG5vbi1KYXZhZG9jKQ0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorCQlwbHVnaW4gPSBudWxsOw0KKwkJc3VwZXIuc3RvcChjb250ZXh0KTsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQorCSAqDQorCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsNCisJCXJldHVybiBwbHVnaW47DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9zcmMvY29tcmVsL2ludGVycHJldGVyL0NvbXJlbEludGVycHJldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL3NyYy9jb21yZWwvaW50ZXJwcmV0ZXIvQ29tcmVsSW50ZXJwcmV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDIxZmZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9zcmMvY29tcmVsL2ludGVycHJldGVyL0NvbXJlbEludGVycHJldGVyLmphdmEKQEAgLTAsMCArMSw2ODMgQEAKK3BhY2thZ2UgY29tcmVsLmludGVycHJldGVyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLkNoYW5nZURlc2NyaXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLnV0aWwuQ2hhbmdlUmVjb3JkZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5jb3JlLlJlZmFjdG9yaW5nOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcubWFuYWdlcnMuUmVmYWN0b3JpbmdNYW5hZ2VyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcucnVudGltZS5sdGsuTHRrRW1mUmVmYWN0b3JpbmdQcm9jZXNzb3JBZGFwdGVyOw0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkhlbHBlcjsNCitpbXBvcnQgY29tcmVsLkhlbHBlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLk11bHRpUG9ydDsNCitpbXBvcnQgY29tcmVsLk11bHRpUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5Qb3J0Ow0KK2ltcG9ydCBjb21yZWwuUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZpbHRlckhlbHBlcjsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuZXh0ZW5zaW9ucy5JTXVsdGlGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuZXh0ZW5zaW9ucy5JTXVsdGlGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5leHRlbnNpb25zLklTaW5nbGVGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuZXh0ZW5zaW9ucy5JU2luZ2xlRmlsdGVySGVscGVyOw0KK2ltcG9ydCBjb21yZWwudXRpbC5FeHRlbnNpb25Qb2ludEluZm87DQoraW1wb3J0IGNvbXJlbC51dGlsLlJlZ2lzdHJ5VXRpbDsNCisNCitwdWJsaWMgY2xhc3MgQ29tcmVsSW50ZXJwcmV0ZXIgew0KKwkNCisJcHJpdmF0ZSBMaW5rZWRMaXN0PFJlZmFjdG9yaW5nPiBlbWZSZWZhY3RvcmluZ3MgPSBuZXcgTGlua2VkTGlzdDxSZWZhY3RvcmluZz4oKTsNCisJcHJpdmF0ZSBTZXQ8SGVscGVyPiBoZWxwZXIgPSBuZXcgSGFzaFNldDxIZWxwZXI+KCk7DQorCXByaXZhdGUgQ29tcG9zaXRlUmVmYWN0b3JpbmcgY29tcG9zaXRlUmVmYWN0b3Jpbmc7DQorCXByaXZhdGUgUmVmYWN0b3JpbmdVbml0IG1haW5SZWZhY3RvcmluZ1VuaXQ7DQorCXByaXZhdGUgRU9iamVjdCByb290T2JqZWN0Ow0KKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tQcmVjb25kaXRpb25zID0gdHJ1ZTsJDQorDQorCXB1YmxpYyBDb21yZWxJbnRlcnByZXRlcihFT2JqZWN0IGVPYmplY3QpIHsNCisJCXRoaXMucm9vdE9iamVjdCA9IEVjb3JlVXRpbC5nZXRSb290Q29udGFpbmVyKGVPYmplY3QpOw0KKwkJcmVnaXN0ZXJDb21yZWwoKTsNCisJCXNldEVtZlJlZmFjdG9yaW5ncygpOw0KKwkJc2V0SGVscGVyKCk7DQorCX0NCisJDQorCXB1YmxpYyBSZWZhY3RvcmluZ1VuaXQgZ2V0Um9vdFJlZmFjdG9yaW5nVW5pdCgpIHsNCisJCXJldHVybiBtYWluUmVmYWN0b3JpbmdVbml0Ow0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBsb2FkQ29tcmVsTW9kZWwoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBGaWxlKGZpbGVOYW1lKS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQorCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCisJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsNCisJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsNCisJCWNvbXBvc2l0ZVJlZmFjdG9yaW5nID0gKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsNCisJCW1haW5SZWZhY3RvcmluZ1VuaXQgPSBjb21wb3NpdGVSZWZhY3RvcmluZy5nZXRNYWluUmVmYWN0b3JpbmdVbml0KCk7DQorCQlpZiAoKGNvbXBvc2l0ZVJlZmFjdG9yaW5nLmdldEN1c3RvbUluaXRpYWxDb25kaXRpb24oKSA9PSBudWxsIA0KKwkJCQl8fCBjb21wb3NpdGVSZWZhY3RvcmluZy5nZXRDdXN0b21Jbml0aWFsQ29uZGl0aW9uKCkuaXNFbXB0eSgpKQ0KKwkJCSYmIChjb21wb3NpdGVSZWZhY3RvcmluZy5nZXRDdXN0b21GaW5hbENvbmRpdGlvbigpID09IG51bGwgDQorCQkJCXx8IGNvbXBvc2l0ZVJlZmFjdG9yaW5nLmdldEN1c3RvbUZpbmFsQ29uZGl0aW9uKCkuaXNFbXB0eSgpKSkgew0KKwkJCS8vIFRoZXJlIGFyZSBubyBwcmVjb25kaXRpb24gY2hlY2tzIGZvciB0aGUgY29tcG9zaXRlIHJlZmFjdG9yaW5nOg0KKwkJCS8vIHNldCAnY2hlY2tQcmVjb25kaXRpb25zJyB0byB0cnVlIHRvIGNoZWNrIHBlY29uZGl0aW9ucyBpbnNpZGUhDQorCQkJY2hlY2tQcmVjb25kaXRpb25zID0gdHJ1ZTsNCisJCX0gZWxzZSB7DQorCQkJY2hlY2tQcmVjb25kaXRpb25zID0gZmFsc2U7DQorCQl9DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7DQorCQlleGVjdXRlUmVmYWN0b3JpbmdVbml0KHRoaXMubWFpblJlZmFjdG9yaW5nVW5pdCk7DQorCX0NCisJDQorCS8vIG5lZWRlZA0KKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJDb21yZWwoKSB7DQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQ0KKwkJCS5wdXQoQ29tcmVsUGFja2FnZS5lTlNfVVJJLCBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRSk7DQorCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpDQorCQkJLnB1dCgiY29tcmVsIiwgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7DQorCX0NCisNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgdm9pZCBzZXRFbWZSZWZhY3RvcmluZ3MoKSB7DQorCQl0aGlzLmVtZlJlZmFjdG9yaW5ncyA9IFJlZmFjdG9yaW5nTWFuYWdlci5nZXRBbGxSZWZhY3RvcmluZ3MoKTsNCisJfQ0KKwkNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgdm9pZCBzZXRIZWxwZXIoKSB7DQorCQloZWxwZXIuYWRkQWxsKFJlZ2lzdHJ5VXRpbC5sb2FkTXVsdGlGZWF0dXJlSGVscGVyKCkpOw0KKwkJaGVscGVyLmFkZEFsbChSZWdpc3RyeVV0aWwubG9hZE11bHRpRmlsdGVySGVscGVyKCkpOw0KKwkJaGVscGVyLmFkZEFsbChSZWdpc3RyeVV0aWwubG9hZFNpbmdsZUZlYXR1cmVIZWxwZXIoKSk7DQorCQloZWxwZXIuYWRkQWxsKFJlZ2lzdHJ5VXRpbC5sb2FkU2luZ2xlRmlsdGVySGVscGVyKCkpOw0KKwl9DQorCQ0KKwkvLyBuZWVkZWQNCisJcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVSZWZhY3RvcmluZ1VuaXQoUmVmYWN0b3JpbmdVbml0IHJlZmFjdG9yaW5nVW5pdCkgew0KKwkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7DQorCQlpZiAocmVmYWN0b3JpbmdVbml0IGluc3RhbmNlb2YgQXRvbWljVW5pdCkgew0KKwkJCXN1Y2Nlc3MgPSBleGVjdXRlQXRvbWljVW5pdCgoQXRvbWljVW5pdCkgcmVmYWN0b3JpbmdVbml0KTsNCisJCX0NCisJCWlmIChyZWZhY3RvcmluZ1VuaXQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0KSB7DQorCQkJc3VjY2VzcyA9IGV4ZWN1dGVTaW5nbGVRdWV1ZWRVbml0KChTaW5nbGVRdWV1ZWRVbml0KXJlZmFjdG9yaW5nVW5pdCk7DQorCQl9DQorCQlpZiAocmVmYWN0b3JpbmdVbml0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXQpIHsNCisJCQlzdWNjZXNzID0gZXhlY3V0ZVNlcXVlbnRpYWxVbml0KChTZXF1ZW50aWFsVW5pdCkgcmVmYWN0b3JpbmdVbml0KTsNCisJCX0JCQ0KKwkJcmV0dXJuIHN1Y2Nlc3M7DQorCX0NCisJDQorCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlQXRvbWljVW5pdChBdG9taWNVbml0IGF0b21pY1VuaXQpIHsNCisJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IGV4ZWN1dGlvbiBvZiBBdG9taWNVbml0Iik7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiMSAtIExvYWQgY29ycmVzcG9uZGluZyBFbWZSZWZhY3RvcmluZyIpOw0KKwkJUmVmYWN0b3JpbmcgYXRvbWljUmVmYWN0b3JpbmcgPSBnZXRFbWZSZWZhY3RvcmluZ0Zyb21BdG9taWNVbml0KGF0b21pY1VuaXQpOw0KKwkJaWYgKGF0b21pY1JlZmFjdG9yaW5nID09IG51bGwpIHsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRocm93IG5ldyBFbWZSZWZhY3RvcmluZ05vdEZvdW5kRXhjZXB0aW9uKCkiKTsNCisJCX0gZWxzZSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVtZlJlZmFjdG9yaW5nOiAiICsgYXRvbWljUmVmYWN0b3JpbmcuZ2V0TmFtZSgpKTsNCisJCX0NCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIyIC0gUGFzcyBwb3J0IHZhbHVlcyB0byBFbWZSZWZhY3RvcmluZyIpOw0KKwkJcGFzc1BvcnRWYWx1ZXMoYXRvbWljVW5pdCwgYXRvbWljUmVmYWN0b3JpbmcpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIjMgLSBDaGVjayBpbml0aWFsIGFuZCBmaW5hbCBjb25kaXRpb25zIik7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiQ29udHJvbGxlciBudWxsPzogIiANCisvLwkJCQkrIChhdG9taWNSZWZhY3RvcmluZy5nZXRDb250cm9sbGVyKCkgPT0gbnVsbCkpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NvciBudWxsPzogIiANCisvLwkJCQkrIChhdG9taWNSZWZhY3RvcmluZy5nZXRDb250cm9sbGVyKCkuZ2V0THRrUmVmYWN0b3JpbmdQcm9jZXNzb3IoKSA9PSBudWxsKSk7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiU2V0U2VsZWN0aW9uIHRvIGluaXRpYWxpemUgUHJvY2Vzc29yIik7DQorCQkvLyBuZXcgDQorCQlMaXN0PEVPYmplY3Q+IHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsNCisJCWlmIChhdG9taWNSZWZhY3RvcmluZw0KKwkJCQkuZ2V0Q29udHJvbGxlcigpDQorCQkJCS5nZXREYXRhTWFuYWdlbWVudE9iamVjdCgpDQorCQkJCS5nZXRJblBvcnRCeU5hbWUoInNlbGVjdGVkRU9iamVjdCIpLmdldFZhbHVlKCkgDQorCQkJCWluc3RhbmNlb2YgRU9iamVjdCkgew0KKwkJCXNlbGVjdGlvbi5hZGQoKEVPYmplY3QpIGF0b21pY1JlZmFjdG9yaW5nDQorCQkJCQkuZ2V0Q29udHJvbGxlcigpDQorCQkJCQkuZ2V0RGF0YU1hbmFnZW1lbnRPYmplY3QoKQ0KKwkJCQkJLmdldEluUG9ydEJ5TmFtZSgic2VsZWN0ZWRFT2JqZWN0IikNCisJCQkJCS5nZXRWYWx1ZSgpKTsNCisJCX0NCisJCWlmIChhdG9taWNSZWZhY3RvcmluZw0KKwkJCQkuZ2V0Q29udHJvbGxlcigpDQorCQkJCS5nZXREYXRhTWFuYWdlbWVudE9iamVjdCgpDQorCQkJCS5nZXRJblBvcnRCeU5hbWUoInNlbGVjdGVkRU9iamVjdCIpLmdldFZhbHVlKCkgDQorCQkJCWluc3RhbmNlb2YgSUVPYmplY3RHZXR0ZXIpIHsNCisJCQlzZWxlY3Rpb24uYWRkKCgoSUVPYmplY3RHZXR0ZXIpIGF0b21pY1JlZmFjdG9yaW5nDQorCQkJCQkuZ2V0Q29udHJvbGxlcigpDQorCQkJCQkuZ2V0RGF0YU1hbmFnZW1lbnRPYmplY3QoKQ0KKwkJCQkJLmdldEluUG9ydEJ5TmFtZSgic2VsZWN0ZWRFT2JqZWN0IikNCisJCQkJCS5nZXRWYWx1ZSgpKS5nZXRFT2JqZWN0KCkpOw0KKwkJfQkJDQorCQkvLyBlbmQgbmV3DQorCQlhdG9taWNSZWZhY3RvcmluZy5nZXRDb250cm9sbGVyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc29yIG51bGw/OiAiIA0KKy8vCQkJCSsgKGF0b21pY1JlZmFjdG9yaW5nLmdldENvbnRyb2xsZXIoKS5nZXRMdGtSZWZhY3RvcmluZ1Byb2Nlc3NvcigpID09IG51bGwpKTsNCisJCUx0a0VtZlJlZmFjdG9yaW5nUHJvY2Vzc29yQWRhcHRlciByZWZhY3RvcmluZ1Byb2Nlc3NvciA9IA0KKwkJCShMdGtFbWZSZWZhY3RvcmluZ1Byb2Nlc3NvckFkYXB0ZXIpDQorCQkJCWF0b21pY1JlZmFjdG9yaW5nLmdldENvbnRyb2xsZXIoKS5nZXRMdGtSZWZhY3RvcmluZ1Byb2Nlc3NvcigpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmFjdG9yaW5nUHJvY2Vzc29yOiAiICsgcmVmYWN0b3JpbmdQcm9jZXNzb3IudG9TdHJpbmcoKSk7DQorCQkvLyBORVc6IGNoZWNrIHByZWNvbmRpdGlvbnMgaWYgc3BlY2lmaWVkIGJ5IGZsYWcNCisJCWlmIChjaGVja1ByZWNvbmRpdGlvbnMpIHsNCisJCQlpZiAoISByZWZhY3RvcmluZ1Byb2Nlc3Nvci5jaGVja0NvbmRpdGlvbnMoKSkgew0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXRvbWljVW5pdCB3YXMgTk9UIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSEiKTsNCisJCQkJcmV0dXJuIHN1Y2Nlc3M7DQorCQkJfQ0KKwkJfQkNCisJCS8vIGVpdGhlcjogbm8gcHJlY29uZGl0aW9uIGNoZWNrDQorCQkvLyBvcjogc3VjY2Vzc2Z1bCBwcmVjb25kaXRpb24gY2hlY2sNCisJCS8vIC0+IGV4ZWN1dGUgcmVmYWN0b3JpbmchDQorCQl0cnkgew0KKwkJCXJlZmFjdG9yaW5nUHJvY2Vzc29yLmNyZWF0ZUNoYW5nZQ0KKwkJCQkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkucGVyZm9ybShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCisJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXRvbWljVW5pdCB3YXMgTk9UIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSEiKTsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkF0b21pY1VuaXQgd2FzIE5PVCBleGVjdXRlZCBzdWNjZXNzZnVsbHkhIik7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJBdG9taWNVbml0IHdhcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkhIik7DQorCQlzdWNjZXNzID0gdHJ1ZTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJFbmQgZXhlY3V0aW9uIG9mIEF0b21pY1VuaXQiKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisJCXJldHVybiBzdWNjZXNzOw0KKwl9DQorCQ0KKwlwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZVNlcXVlbnRpYWxVbml0KFNlcXVlbnRpYWxVbml0IHNlcXVlbnRpYWxVbml0KSB7DQorCQlib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IGV4ZWN1dGlvbiBvZiBTZXF1ZW50aWFsVW5pdCIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIjEgLSBTZXQgZW50aXJlIHBvcnQgdmFsdWVzIik7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiMSBhIC0gRG8gcG9ydCBtYXBwaW5nIG9mIGVhY2ggbWFpbiBpbnB1dCBwb3J0Iik7DQorCQlmb3IgKElucHV0UG9ydCBpcCA6IHNlcXVlbnRpYWxVbml0LmdldElucHV0UG9ydHMoKSkgew0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCIxIGEgaSAgLSBHZXQgcG9ydCBtYXBwaW5nIGZyb20gaW5wdXQgcG9ydCIpOw0KKwkJCUxpc3Q8UG9ydE1hcHBpbmc+IHBtcyA9IGdldFBvcnRNYXBwaW5nc0Zyb21Tb3VyY2VQb3J0KHNlcXVlbnRpYWxVbml0LCBpcCk7DQorCQkJZm9yIChQb3J0TWFwcGluZyBwbSA6IHBtcykgew0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gUG9ydE1hcHBpbmcgKHNvdXJjZSk6ICIgKyBwbS5nZXRTb3VyY2UoKSk7DQorLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgLSBQb3J0TWFwcGluZyAodGFyZ2V0KTogIiArIHBtLmdldFRhcmdldCgpKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIjEgYSBpaSAtIGRvIHBvcnQgbWFwcGluZyIpOw0KKwkJCQlkb1BvcnRNYXBwaW5nKHBtKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIFBvcnRNYXBwaW5nIChzb3VyY2UpOiAiICsgcG0uZ2V0U291cmNlKCkpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gUG9ydE1hcHBpbmcgKHRhcmdldCk6ICIgKyBwbS5nZXRUYXJnZXQoKSk7DQorCQkJfQ0KKwkJfQ0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIjEgYiAtIEV4ZWN1dGUgZWFjaCBoZWxwZXIiKTsNCisJCWludCBudW1iZXJPZkhlbHBlcnMgPSBzZXF1ZW50aWFsVW5pdC5nZXRIZWxwZXJVbml0cygpLnNpemUoKTsNCisJCWJvb2xlYW4gYWxsSGVscGVyc0V4ZWN1dGVkID0gZmFsc2U7DQorCQl3aGlsZSghYWxsSGVscGVyc0V4ZWN1dGVkKSB7DQorCQkJaW50IG51bWJlck9mRXhlY3V0ZWRIZWxwZXJzID0gMDsNCisJCQlmb3IgKEhlbHBlclVuaXQgaHUgOiBzZXF1ZW50aWFsVW5pdC5nZXRIZWxwZXJVbml0cygpKSB7DQorLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIxIGIgaSAtIEV4ZWN1dGUgaGVscGVyIHdpdGggc2V0IGlucHV0IHBvcnQiKTsNCisJCQkJYm9vbGVhbiBoZWxwZXJJbnB1dFBvcnRzU2V0ID0gY2hlY2tQb3J0VmFsdWVzU2V0SW5IZWxwZXJVbml0KGh1KTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIC0gaGVscGVySW5wdXRQb3J0c1NldDogIiArIGhlbHBlcklucHV0UG9ydHNTZXQpOw0KKwkJCQlpZiAoaGVscGVySW5wdXRQb3J0c1NldCkgew0KKwkJCQkJZXhlY3V0ZUhlbHBlclVuaXQoaHUpOw0KKy8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIjEgYiBpaWkgLSBEbyBtYXBwaW5ncyBmcm9tIGhlbHBlciBvdXRwdXQgcG9ydHMiKTsNCisvLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIC0gR2V0IHBvcnQgbWFwcGluZyBmcm9tIG91dHB1dCBwb3J0Iik7DQorCQkJCQlMaXN0PFBvcnRNYXBwaW5nPiBwbXMgPSBnZXRQb3J0TWFwcGluZ3NGcm9tU291cmNlUG9ydChzZXF1ZW50aWFsVW5pdCwgaHUuZ2V0T3V0cHV0UG9ydCgpKTsNCisJCQkJCWZvciAoUG9ydE1hcHBpbmcgcG0gOiBwbXMpIHsNCisvLwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAtIFBvcnRNYXBwaW5nIChzb3VyY2UpOiAiICsgcG0uZ2V0U291cmNlKCkpOw0KKy8vCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIC0gUG9ydE1hcHBpbmcgKHRhcmdldCk6ICIgKyBwbS5nZXRUYXJnZXQoKSk7DQorLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgLSBkbyBQb3J0TWFwcGluZyIpOw0KKwkJCQkJCWRvUG9ydE1hcHBpbmcocG0pOw0KKy8vCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIC0gUG9ydE1hcHBpbmcgKHNvdXJjZSk6ICIgKyBwbS5nZXRTb3VyY2UoKSk7DQorLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgLSBQb3J0TWFwcGluZyAodGFyZ2V0KTogIiArIHBtLmdldFRhcmdldCgpKTsNCisJCQkJCQkNCisJCQkJCX0NCisJCQkJCW51bWJlck9mRXhlY3V0ZWRIZWxwZXJzKys7DQorCQkJCX0NCisJCQl9DQorCQkJYWxsSGVscGVyc0V4ZWN1dGVkID0gKG51bWJlck9mRXhlY3V0ZWRIZWxwZXJzID09IG51bWJlck9mSGVscGVycyk7DQorCQl9CQkNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIyIC0gSW5pdCB2YXJpYWJsZXMiKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIyIGEgLSBTZXQgZmxhZyB3aXRoIHJlc3BlY3QgdG8gYSBzdHJpY3QgZXhlY3V0aW9uIik7DQorCQlmaW5hbCBib29sZWFuIHN0cmljdCA9IHNlcXVlbnRpYWxVbml0LmlzU3RyaWN0KCk7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgRXhlY3V0aW9uIGlzIHN0cmljdDogIiArIHN0cmljdCk7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiMiBiIC0gU2V0IG1heCBudW1iZXIgb2YgY2hpbGQgdW5pdHMiKTsNCisJCWludCBtYXggPSBzZXF1ZW50aWFsVW5pdC5nZXRSZWZhY3RvcmluZ1VuaXRzKCkuc2l6ZSgpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIE1heCBudW1iZXIgb2YgY2hpbGQgdW5pdHM6ICIgKyBtYXgpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIjMgLSBFeGVjdXRlIGNoaWxkIHVuaXRzIik7DQorCQkvLyBwcmVwYXJlIHJvbGxiYWNrDQorCQlDaGFuZ2VSZWNvcmRlciBjaGFuZ2VSZWNvcmRlciA9IG5ldyBDaGFuZ2VSZWNvcmRlcihyb290T2JqZWN0KTsNCisJCWZvciAoaW50IGkgPSAxOyBpIDw9IG1heDsgaSsrKSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtPiBFeGVjdXRpb24gbm86ICIgKyBpKTsNCisJCQlSZWZhY3RvcmluZ1VuaXQgcnUgPSBnZXRSZWZhY3RvcmluZ1VuaXRCeUluZGV4KHNlcXVlbnRpYWxVbml0LCBpKTsNCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0gIEV4ZWN1dGUgY2hpbGQgdW5pdDogIiArIHJ1KTsNCisJCQlCb29sZWFuIGNoaWxkU3VjY2VzcyA9IGV4ZWN1dGVSZWZhY3RvcmluZ1VuaXQocnUpOw0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLSAgUmVzdWx0IGV4ZWN1dGlvbjogIiArIGNoaWxkU3VjY2Vzcyk7DQorCQkJaWYgKHN0cmljdCAmJiAhIGNoaWxkU3VjY2Vzcykgew0KKwkJCQkvLyByb2xsYmFjaw0KKwkJCQlDaGFuZ2VEZXNjcmlwdGlvbiBjaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZVJlY29yZGVyLmVuZFJlY29yZGluZygpOw0KKwkJCQljaGFuZ2VEZXNjcmlwdGlvbi5hcHBseSgpOw0KKwkJCQkvLyBlbmQgcm9sbGJhY2sNCisJCQkJc3VjY2VzcyA9IGZhbHNlOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQlpZiAoc3VjY2Vzcykgew0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZXF1ZW50aWFsVW5pdCB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5ISIpOw0KKwkJfSBlbHNlIHsNCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VxdWVudGlhbFVuaXQgd2FzIE5PVCBleGVjdXRlZCBzdWNjZXNzZnVsbHkhIik7DQorCQl9DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIGV4ZWN1dGlvbiBvZiBTZXF1ZW50aWFsVW5pdCIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwkJcmV0dXJuIHN1Y2Nlc3M7DQorCX0NCisJDQorCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlU2luZ2xlUXVldWVkVW5pdChTaW5nbGVRdWV1ZWRVbml0IHNpbmdsZVF1ZXVlZFVuaXQpIHsNCisJCWJvb2xlYW4gc3VjY2VzcyA9IHRydWU7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgZXhlY3V0aW9uIG9mIFNpbmdsZVF1ZXVkVW5pdCIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIjEgLSBTZXQgZmxhZyB3aXRoIHJlc3BlY3QgdG8gYSBzdHJpY3QgZXhlY3V0aW9uIik7DQorCQlmaW5hbCBib29sZWFuIHN0cmljdCA9IHNpbmdsZVF1ZXVlZFVuaXQuaXNTdHJpY3QoKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJFeGVjdXRpb24gaXMgc3RyaWN0OiAiICsgc3RyaWN0KTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIyIC0gU2V0IG1heCBudW1iZXIgb2YgY2hpbGQgdW5pdCBleGVjdXRpb25zIik7DQorCQlpbnQgbWF4ID0gc2luZ2xlUXVldWVkVW5pdC5nZXRNdWx0aUlucHV0UG9ydCgpLmdldFZhbHVlKCkuc2l6ZSgpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1heCBudW1iZXIgb2YgY2hpbGQgdW5pdCBleGVjdXRpb25zOiAiICsgbWF4KTsNCisJCS8vIHByZXBhcmUgcm9sbGJhY2sNCisJCUNoYW5nZVJlY29yZGVyIGNoYW5nZVJlY29yZGVyID0gbmV3IENoYW5nZVJlY29yZGVyKHJvb3RPYmplY3QpOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0gRXhlY3V0aW9uIG5vOiAiICsgaSk7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIjMgKGEpIC0gUGFzcyBwb3J0IHZhbHVlcyB0byBjaGlsZCB1bml0Iik7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gR2V0IE11bHRpSW5wdXRQb3J0IGZyb20gcGFyZW50IHVuaXQiKTsNCisJCQlNdWx0aUlucHV0UG9ydCBtaXAgPSBzaW5nbGVRdWV1ZWRVbml0LmdldE11bHRpSW5wdXRQb3J0KCk7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gTXVsdGlJbnB1dFBvcnQgKE5hbWUvVHlwZSk6ICIgKyBtaXAuZ2V0TmFtZSgpICsgIjsgIiArIG1pcC5nZXRUeXBlKCkpOw0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCItIEdldCBjb3JyZXNwb25kaW5nIFBvcnRNYXBwaW5nIik7DQorCQkJUG9ydE1hcHBpbmcgcG0gPSBnZXRQb3J0TWFwcGluZ0Zyb21Tb3VyY2VQb3J0KHNpbmdsZVF1ZXVlZFVuaXQsIG1pcCk7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gUG9ydE1hcHBpbmcgKHNvdXJjZSk6ICIgKyBwbS5nZXRTb3VyY2UoKSk7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gUG9ydE1hcHBpbmcgKHRhcmdldCk6ICIgKyBwbS5nZXRUYXJnZXQoKSk7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gUGFzcyB2YWx1ZSAiICsgaSArICIgZnJvbSBNdWx0aUlucHV0UG9ydCB0byBTaW5nbGVJbnB1dFBvcnQiKTsNCisJCQlpZiAobWlwLmdldFZhbHVlKCkuZ2V0KGkpID09IG51bGwpIHsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0+IG51bGwgdmFsdWUgb24gcG9ydCBwb3NpdGlvbiAiICsgaSArICI6IGNvbnRpbnVlIik7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlpZiAoKCgoRU9iamVjdCltaXAuZ2V0VmFsdWUoKS5nZXQoaSkpLmVSZXNvdXJjZSgpID09IG51bGwpDQorCQkJCQl8fCAoKChFT2JqZWN0KW1pcC5nZXRWYWx1ZSgpLmdldChpKSkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKSl7DQorLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCItPiBudWxsIHJlc3NvdXJjZS9yZXNzb3VyY2VzZXQgb24gcG9ydCBwb3NpdGlvbiAiICsgaSArICI6IGNvbnRpbnVlIik7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlwYXNzVmFsdWVGcm9tTXVsdGlJbnB1dFBvcnRUb1NpbmdsZUlucHV0UG9ydChwbSwgaSk7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gR2V0IGFsbCBJbnB1dFBvcnRzIGZyb20gY2hpbGRVbml0Iik7DQorCQkJRUxpc3Q8SW5wdXRQb3J0PiBpbnB1dFBvcnRzID0gDQorCQkJCXNpbmdsZVF1ZXVlZFVuaXQuZ2V0UmVmYWN0b3JpbmdVbml0KCkuZ2V0QWxsSW5wdXRQb3J0cygpOw0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCItIFRvdGFsIE51bWJlciBvZiBJbnB1dFBvcnRzIG9mIGNoaWxkVW5pdDogIiArIGlucHV0UG9ydHMuc2l6ZSgpKTsNCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLSBQYXNzIHZhbHVlIHRvIHNlY29uZGFyeSBpbnB1dCBwb3J0cyIpOw0KKwkJCWZvciAoSW5wdXRQb3J0IGlwIDogaW5wdXRQb3J0cykgew0KKwkJCQlpZiAoKChTaW5nbGVJbnB1dFBvcnQpaXApLmdldFZhbHVlKCkgPT0gbnVsbCkgew0KKy8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gR2V0IGNvcnJlc3BvbmRpbmcgUG9ydE1hcHBpbmciKTsNCisJCQkJCVBvcnRNYXBwaW5nIHBtVGVtcCA9IGdldFBvcnRNYXBwaW5nRnJvbVRhcmdldFBvcnQoc2luZ2xlUXVldWVkVW5pdCwgaXApOw0KKy8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gUG9ydE1hcHBpbmcgKHNvdXJjZSk6ICIgKyBwbVRlbXAuZ2V0U291cmNlKCkpOw0KKy8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gUG9ydE1hcHBpbmcgKHRhcmdldCk6ICIgKyBwbVRlbXAuZ2V0VGFyZ2V0KCkpOw0KKwkJCQkJZG9Qb3J0TWFwcGluZyhwbVRlbXApOw0KKwkJCQl9DQorCQkJfQ0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBUeXBlcyBhbmQgVmFsdWVzIG9mIGFsbCBpbnB1dCBwb3J0cyBvZiBjaGlsZCB1bml0OiIpOw0KKy8vCQkJZm9yIChJbnB1dFBvcnQgaXAgOiBzaW5nbGVRdWV1ZWRVbml0LmdldFJlZmFjdG9yaW5nVW5pdCgpLmdldEFsbElucHV0UG9ydHMoKSkgew0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnQoIi0tICIgKyBpcC5nZXROYW1lKCkgKyAiIC8gIik7DQorLy8JCQkJaWYgKGlwIGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0KSB7DQorLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigoKFNpbmdsZUlucHV0UG9ydClpcCkuZ2V0VmFsdWUoKSk7DQorLy8JCQkJfSBlbHNlIHsNCisvLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCgoTXVsdGlJbnB1dFBvcnQpaXApLmdldFZhbHVlKCkpOw0KKy8vCQkJCX0NCisvLwkJCX0NCisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tPiBDQUxMOiBFeGVjdXRlIENoaWxkIFVuaXQiKTsNCisJCQlCb29sZWFuIGNoaWxkU3VjY2VzcyA9IGV4ZWN1dGVSZWZhY3RvcmluZ1VuaXQoc2luZ2xlUXVldWVkVW5pdC5nZXRSZWZhY3RvcmluZ1VuaXQoKSk7DQorCQkJaWYgKHN0cmljdCAmJiAhIGNoaWxkU3VjY2Vzcykgew0KKwkJCQkvLyByb2xsYmFjaw0KKwkJCQlDaGFuZ2VEZXNjcmlwdGlvbiBjaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZVJlY29yZGVyLmVuZFJlY29yZGluZygpOw0KKwkJCQljaGFuZ2VEZXNjcmlwdGlvbi5hcHBseSgpOw0KKwkJCQkvLyBlbmQgcm9sbGJhY2sNCisJCQkJc3VjY2VzcyA9IGZhbHNlOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorLy8JCWlmIChzdWNjZXNzKSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNpbmdsZVF1ZXVkVW5pdCB3YXMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5ISIpOw0KKy8vCQl9IGVsc2Ugew0KKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJTaW5nbGVRdWV1ZFVuaXQgd2FzIE5PVCBleGVjdXRlZCBzdWNjZXNzZnVsbHkhIik7DQorLy8JCX0NCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJFbmQgZXhlY3V0aW9uIG9mIFNpbmdsZVF1ZXVkVW5pdCIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwkJcmV0dXJuIHN1Y2Nlc3M7DQorCX0NCisJDQorCS8vIG5lZWRlZA0KKwlwcml2YXRlIHZvaWQgZG9Qb3J0TWFwcGluZyhQb3J0TWFwcGluZyBwbSkgew0KKwkJaWYgKHBtIGluc3RhbmNlb2YgU2luZ2xlUG9ydE1hcHBpbmcpIHsNCisJCQlTaW5nbGVQb3J0IHNvdXJjZSA9ICgoU2luZ2xlUG9ydE1hcHBpbmcpIHBtKS5nZXRTb3VyY2UoKTsNCisJCQlTaW5nbGVQb3J0IHRhcmdldCA9ICgoU2luZ2xlUG9ydE1hcHBpbmcpIHBtKS5nZXRUYXJnZXQoKTsNCisJCQl0YXJnZXQuc2V0VmFsdWUoc291cmNlLmdldFZhbHVlKCkpOw0KKwkJfQ0KKwkJaWYgKHBtIGluc3RhbmNlb2YgTXVsdGlQb3J0TWFwcGluZykgew0KKwkJCU11bHRpUG9ydCBtaXAgPSAoKE11bHRpUG9ydE1hcHBpbmcpIHBtKS5nZXRTb3VyY2UoKTsNCisJCQlNdWx0aVBvcnQgc2lwID0gKChNdWx0aVBvcnRNYXBwaW5nKSBwbSkuZ2V0VGFyZ2V0KCk7DQorCQkJc2lwLmdldFZhbHVlKCkuY2xlYXIoKTsNCisJCQlzaXAuZ2V0VmFsdWUoKS5hZGRBbGwobWlwLmdldFZhbHVlKCkpOw0KKwkJfQ0KKwl9DQorCQ0KKwkvLyBuZWVkZWQNCisJcHJpdmF0ZSB2b2lkIHJ1bkhlbHBlcihIZWxwZXJVbml0IGh1LCBIZWxwZXIgaCkgew0KKwkJaWYgKGggaW5zdGFuY2VvZiBTaW5nbGVGaWx0ZXJIZWxwZXIpIHsNCisJCQlJU2luZ2xlRmlsdGVySGVscGVyIGlzZmloID0gZ2V0SVNpbmdsZUZpbHRlckhlbHBlckZyb21TaW5nbGVGaWx0ZXJIZWxwZXIoKFNpbmdsZUZpbHRlckhlbHBlcikgaCk7DQorCQkJaWYgKGlzZmloICE9IG51bGwpIHsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIG91dHB1dCB2YWx1ZSBiZWZvcmU6ICIgKyBpc2ZpaC5nZXRPdXRwdXRQb3J0KCkuZ2V0VmFsdWUoKSk7DQorCQkJCWlzZmloLmdldElucHV0UG9ydCgpLmdldFZhbHVlKCkuYWRkQWxsKCgoU2luZ2xlRmlsdGVyVW5pdClodSkuZ2V0SW5wdXRQb3J0KCkuZ2V0VmFsdWUoKSk7DQorCQkJCS8vIFRPRE8gcGFzcyBzZWNvbmRhcnkgcG9ydCB2YWx1ZXMgLT4gY2hhbmdlIEludGVyZmFjZSBJU2luZ2xlRmlsdGVySGVscGVyLi4uDQorCQkJCWlzZmloLnJ1bigpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gb3V0cHV0IHZhbHVlIGFmdGVyOiAiICsgaXNmaWguZ2V0T3V0cHV0UG9ydCgpLmdldFZhbHVlKCkpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gc2V0IG91dHB1dCB2YWx1ZSB0byBoZWxwZXIgdW5pdCIpOw0KKwkJCQkoKFNpbmdsZUZpbHRlclVuaXQpaHUpLmdldE91dHB1dFBvcnQoKS5zZXRWYWx1ZShpc2ZpaC5nZXRPdXRwdXRQb3J0KCkuZ2V0VmFsdWUoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGggaW5zdGFuY2VvZiBNdWx0aUZlYXR1cmVIZWxwZXIpIHsNCisJCQlJTXVsdGlGZWF0dXJlSGVscGVyIGltZmVoID0gZ2V0SU11bHRpRmVhdHVyZUhlbHBlckZyb21NdWx0aUZlYXR1cmVIZWxwZXIoKE11bHRpRmVhdHVyZUhlbHBlcikgaCk7DQorCQkJaWYgKGltZmVoICE9IG51bGwpIHsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIG91dHB1dCB2YWx1ZSBiZWZvcmU6ICIgKyBpbWZlaC5nZXRPdXRwdXRQb3J0KCkuZ2V0VmFsdWUoKSk7DQorCQkJCWltZmVoLmdldElucHV0UG9ydCgpLnNldFZhbHVlKCgoTXVsdGlGZWF0dXJlVW5pdClodSkuZ2V0SW5wdXRQb3J0KCkuZ2V0VmFsdWUoKSk7DQorCQkJCWltZmVoLnJ1bigpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gb3V0cHV0IHZhbHVlIGFmdGVyOiAiICsgaW1mZWguZ2V0T3V0cHV0UG9ydCgpLmdldFZhbHVlKCkpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gc2V0IG91dHB1dCB2YWx1ZSB0byBoZWxwZXIgdW5pdCIpOw0KKwkJCQkoKE11bHRpRmVhdHVyZVVuaXQpaHUpLmdldE91dHB1dFBvcnQoKS5nZXRWYWx1ZSgpLmFkZEFsbChpbWZlaC5nZXRPdXRwdXRQb3J0KCkuZ2V0VmFsdWUoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGggaW5zdGFuY2VvZiBTaW5nbGVGZWF0dXJlSGVscGVyKSB7DQorCQkJSVNpbmdsZUZlYXR1cmVIZWxwZXIgaXNmZWggPSBnZXRJU2luZ2xlRmVhdHVyZUhlbHBlckZyb21TaW5nbGVGZWF0dXJlSGVscGVyKChTaW5nbGVGZWF0dXJlSGVscGVyKSBoKTsNCisJCQlpZiAoaXNmZWggIT0gbnVsbCkgew0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gb3V0cHV0IHZhbHVlIGJlZm9yZTogIiArIGlzZmVoLmdldE91dHB1dFBvcnQoKS5nZXRWYWx1ZSgpKTsNCisJCQkJaXNmZWguZ2V0SW5wdXRQb3J0KCkuc2V0VmFsdWUoKChTaW5nbGVGZWF0dXJlVW5pdClodSkuZ2V0SW5wdXRQb3J0KCkuZ2V0VmFsdWUoKSk7DQorCQkJCWlzZmVoLnJ1bigpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gb3V0cHV0IHZhbHVlIGFmdGVyOiAiICsgaXNmZWguZ2V0T3V0cHV0UG9ydCgpLmdldFZhbHVlKCkpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gc2V0IG91dHB1dCB2YWx1ZSB0byBoZWxwZXIgdW5pdCIpOw0KKwkJCQkoKFNpbmdsZUZlYXR1cmVVbml0KWh1KS5nZXRPdXRwdXRQb3J0KCkuc2V0VmFsdWUoaXNmZWguZ2V0T3V0cHV0UG9ydCgpLmdldFZhbHVlKCkpOw0KKwkJCX0NCisJCX0NCisJCWlmIChoIGluc3RhbmNlb2YgTXVsdGlGaWx0ZXJIZWxwZXIpIHsNCisJCQlJTXVsdGlGaWx0ZXJIZWxwZXIgaW1maWggPSBnZXRJTXVsdGlGaWx0ZXJIZWxwZXJGcm9tTXVsdGlGaWx0ZXJIZWxwZXIoKE11bHRpRmlsdGVySGVscGVyKSBoKTsNCisJCQlpZiAoaW1maWggIT0gbnVsbCkgew0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gb3V0cHV0IHZhbHVlIGJlZm9yZTogIiArIGltZmloLmdldE91dHB1dFBvcnQoKS5nZXRWYWx1ZSgpKTsNCisJCQkJaW1maWguZ2V0SW5wdXRQb3J0KCkuZ2V0VmFsdWUoKS5hZGRBbGwoKChNdWx0aUZpbHRlclVuaXQpaHUpLmdldElucHV0UG9ydCgpLmdldFZhbHVlKCkpOw0KKwkJCQkvLyBUT0RPIHBhc3Mgc2Vjb25kYXJ5IHBvcnQgdmFsdWVzIC0+IGNoYW5nZSBJbnRlcmZhY2UgSU11bHRpRmlsdGVySGVscGVyLi4uDQorCQkJCWltZmloLnJ1bigpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gb3V0cHV0IHZhbHVlIGFmdGVyOiAiICsgaW1maWguZ2V0T3V0cHV0UG9ydCgpLmdldFZhbHVlKCkpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gc2V0IG91dHB1dCB2YWx1ZSB0byBoZWxwZXIgdW5pdCIpOw0KKwkJCQkoKE11bHRpRmlsdGVyVW5pdClodSkuZ2V0T3V0cHV0UG9ydCgpLmdldFZhbHVlKCkuYWRkQWxsKGltZmloLmdldE91dHB1dFBvcnQoKS5nZXRWYWx1ZSgpKTsNCisJCQl9DQorCQl9DQorCX0NCisJDQorCXByaXZhdGUgSU11bHRpRmlsdGVySGVscGVyIGdldElNdWx0aUZpbHRlckhlbHBlckZyb21NdWx0aUZpbHRlckhlbHBlcigNCisJCQlNdWx0aUZpbHRlckhlbHBlciBoKSB7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiMSBiIGlpIC0gTG9hZCBJbnRlcmZhY2UgSU11bHRpRmlsdGVySGVscGVyIik7DQorCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpTXVsdGlGaWx0ZXJIZWxwZXJzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQ0KKwkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoRXh0ZW5zaW9uUG9pbnRJbmZvLk1VTFRJRklMVEVSX0VYVEVOU0lPTl9QT0lOVCk7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gTnVtYmVyIG9mIG11bHRpZmlsdGVyczogIiArIGlNdWx0aUZpbHRlckhlbHBlcnMubGVuZ3RoKTsNCisJCUlNdWx0aUZpbHRlckhlbHBlciBpbWZpaCA9IG51bGw7DQorCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBpY2UgOiBpTXVsdGlGaWx0ZXJIZWxwZXJzKSB7DQorCQkJdHJ5IHsNCisJCQkJU3RyaW5nIGhlbHBlcklkID0gaC5nZXRIZWxwZXJJZCgpOw0KKwkJCQlTdHJpbmcgaWQgPSBpY2UuZ2V0QXR0cmlidXRlKCJpZCIpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gaWQgb2YgaGVscGVyOiAiICsgaGVscGVySWQpOw0KKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gaWQgb2YgaW50ZXJmYWNlOiAiICsgaWQpOw0KKwkJCQlpZiAoaGVscGVySWQuZXF1YWxzKGlkKSkgew0KKwkJCQkJaW1maWggID0gKElNdWx0aUZpbHRlckhlbHBlcikgaWNlLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7DQorCQkJCQlicmVhazsNCisJCQkJfQkJCQkNCisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQl9DQorCQl9DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gY2xhc3Mgb2YgbXVsdGlmaWx0ZXI6ICIgKyBpbWZpaC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQorCQlyZXR1cm4gaW1maWg7DQorCX0NCisNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgSVNpbmdsZUZlYXR1cmVIZWxwZXIgZ2V0SVNpbmdsZUZlYXR1cmVIZWxwZXJGcm9tU2luZ2xlRmVhdHVyZUhlbHBlcigNCisJCQlTaW5nbGVGZWF0dXJlSGVscGVyIGgpIHsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIxIGIgaWkgLSBMb2FkIEludGVyZmFjZSBJU2luZ2xlRmVhdHVyZUhlbHBlciIpOw0KKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaVNpbmdsZUZlYXR1cmVIZWxwZXJzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQ0KKwkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoRXh0ZW5zaW9uUG9pbnRJbmZvLlNJTkdMRUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgLSBOdW1iZXIgb2Ygc2luZ2xlZmVhdHVyZXM6ICIgKyBpU2luZ2xlRmVhdHVyZUhlbHBlcnMubGVuZ3RoKTsNCisJCUlTaW5nbGVGZWF0dXJlSGVscGVyIGlzZmVoID0gbnVsbDsNCisJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGljZSA6IGlTaW5nbGVGZWF0dXJlSGVscGVycykgew0KKwkJCXRyeSB7DQorCQkJCVN0cmluZyBoZWxwZXJJZCA9IGguZ2V0SGVscGVySWQoKTsNCisJCQkJU3RyaW5nIGlkID0gaWNlLmdldEF0dHJpYnV0ZSgiaWQiKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIGlkIG9mIGhlbHBlcjogIiArIGhlbHBlcklkKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIGlkIG9mIGludGVyZmFjZTogIiArIGlkKTsNCisJCQkJaWYgKGhlbHBlcklkLmVxdWFscyhpZCkpIHsNCisJCQkJCWlzZmVoICA9IChJU2luZ2xlRmVhdHVyZUhlbHBlcikgaWNlLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7DQorCQkJCQlicmVhazsNCisJCQkJfQkJCQkNCisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQl9DQorCQl9DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gY2xhc3Mgb2Ygc2luZ2xlZmVhdHVyZTogIiArIGlzZmVoLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCisJCXJldHVybiBpc2ZlaDsNCisJfQ0KKw0KKwkvLyBuZWVkZWQNCisJcHJpdmF0ZSBQb3J0TWFwcGluZyBnZXRQb3J0TWFwcGluZ0Zyb21Tb3VyY2VQb3J0KFJlZmFjdG9yaW5nVW5pdCByZWZhY3RvcmluZ1VuaXQsIFBvcnQgcG9ydCkgew0KKwkJRUxpc3Q8UG9ydE1hcHBpbmc+IHBvcnRNYXBwaW5ncyA9IGNvbXBvc2l0ZVJlZmFjdG9yaW5nLmdldFBvcnRNYXBwaW5ncygpOw0KKwkJZm9yIChQb3J0TWFwcGluZyBwbSA6IHBvcnRNYXBwaW5ncykgew0KKwkJCWlmIChwbS5nZXRTb3VyY2UoKSA9PSBwb3J0KXsNCisJCQkJcmV0dXJuIHBtOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorCQ0KKwkvLyBuZWVkZWQNCisJcHJpdmF0ZSBQb3J0TWFwcGluZyBnZXRQb3J0TWFwcGluZ0Zyb21UYXJnZXRQb3J0KFJlZmFjdG9yaW5nVW5pdCByZWZhY3RvcmluZ1VuaXQsIElucHV0UG9ydCBwb3J0KSB7DQorCQlFTGlzdDxQb3J0TWFwcGluZz4gcG9ydE1hcHBpbmdzID0gY29tcG9zaXRlUmVmYWN0b3JpbmcuZ2V0UG9ydE1hcHBpbmdzKCk7DQorCQlmb3IgKFBvcnRNYXBwaW5nIHBtIDogcG9ydE1hcHBpbmdzKSB7DQorCQkJaWYgKHBtLmdldFRhcmdldCgpID09IHBvcnQpew0KKwkJCQlyZXR1cm4gcG07DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisJDQorCS8vIG5lZWRlZA0KKwlwcml2YXRlIHZvaWQgcGFzc1ZhbHVlRnJvbU11bHRpSW5wdXRQb3J0VG9TaW5nbGVJbnB1dFBvcnQoUG9ydE1hcHBpbmcgcG0sIGludCBpKSB7DQorCQlNdWx0aUlucHV0UG9ydCBtaXAgPSAoTXVsdGlJbnB1dFBvcnQpIHBtLmdldFNvdXJjZSgpOw0KKwkJU2luZ2xlSW5wdXRQb3J0IHNpcCA9IChTaW5nbGVJbnB1dFBvcnQpIHBtLmdldFRhcmdldCgpOw0KKwkJc2lwLnNldFZhbHVlKG1pcC5nZXRWYWx1ZSgpLmdldChpKSk7DQorCX0NCisJDQorCS8vIG5lZWRlZA0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJcHJpdmF0ZSB2b2lkIHBhc3NQb3J0VmFsdWVzKEF0b21pY1VuaXQgYXRvbWljVW5pdCwNCisJCQlSZWZhY3RvcmluZyBhdG9taWNSZWZhY3RvcmluZykgew0KKwkJZm9yIChTaW5nbGVJbnB1dFBvcnQgc2lwIDogYXRvbWljVW5pdC5nZXRJbnB1dFBvcnRzKCkpIHsNCisJCQlTdHJpbmcgcG9ydE5hbWUgPSBzaXAuZ2V0TmFtZSgpOw0KKwkJCWF0b21pY1JlZmFjdG9yaW5nDQorCQkJCS5nZXRDb250cm9sbGVyKCkuZ2V0RGF0YU1hbmFnZW1lbnRPYmplY3QoKQ0KKwkJCQkuZ2V0SW5Qb3J0QnlOYW1lKHBvcnROYW1lKS5zZXRWYWx1ZShzaXAuZ2V0VmFsdWUoKSk7DQorCQl9DQorCX0NCisNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgUmVmYWN0b3JpbmcgZ2V0RW1mUmVmYWN0b3JpbmdGcm9tQXRvbWljVW5pdChBdG9taWNVbml0IGF0b21pY1VuaXQpIHsNCisJCWZvciAoUmVmYWN0b3JpbmcgZW1mUmVmIDogZW1mUmVmYWN0b3JpbmdzKSB7DQorCQkJaWYgKGVtZlJlZi5nZXRJZCgpLmVxdWFscyhhdG9taWNVbml0LmdldE1vZGVsUmVmYWN0b3JpbmcoKS5nZXRSZWZJZCgpKSl7DQorCQkJCXJldHVybiBlbWZSZWY7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgUmVmYWN0b3JpbmdVbml0IGdldFJlZmFjdG9yaW5nVW5pdEJ5SW5kZXgoDQorCQkJU2VxdWVudGlhbFVuaXQgc2VxdWVudGlhbFVuaXQsIGludCBpKSB7DQorCQlmb3IgKFJlZmFjdG9yaW5nVW5pdCBydSA6IHNlcXVlbnRpYWxVbml0LmdldFJlZmFjdG9yaW5nVW5pdHMoKSkgew0KKwkJCWlmIChydS5nZXRTZXFFeGVjdXRpb25PcmRlcigpID09IGkpIHsNCisJCQkJcmV0dXJuIHJ1Ow0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8vIG5lZWRlZA0KKwlwcml2YXRlIExpc3Q8UG9ydE1hcHBpbmc+IGdldFBvcnRNYXBwaW5nc0Zyb21Tb3VyY2VQb3J0KFJlZmFjdG9yaW5nVW5pdCByZWZhY3RvcmluZ1VuaXQsIFBvcnQgcG9ydCkgew0KKwkJTGlzdDxQb3J0TWFwcGluZz4gcG1zID0gbmV3IEFycmF5TGlzdDxQb3J0TWFwcGluZz4oKTsNCisJCUVMaXN0PFBvcnRNYXBwaW5nPiBwb3J0TWFwcGluZ3MgPSBjb21wb3NpdGVSZWZhY3RvcmluZy5nZXRQb3J0TWFwcGluZ3MoKTsNCisJCWZvciAoUG9ydE1hcHBpbmcgcG0gOiBwb3J0TWFwcGluZ3MpIHsNCisJCQlpZiAocG0uZ2V0U291cmNlKCkgPT0gcG9ydCl7DQorCQkJCXBtcy5hZGQocG0pOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBwbXM7DQorCX0NCisNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgdm9pZCBleGVjdXRlSGVscGVyVW5pdChIZWxwZXJVbml0IGh1KSB7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgLSBleGVjdXRlIEhlbHBlcjogIiArIGh1LmdldEhlbHBlclVuaXRJZCgpKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAtIExvYWQgY29ycmVzcG9uZGluZyBIZWxwZXIiKTsNCisJCUhlbHBlciBoID0gZ2V0SGVscGVyRnJvbUhlbHBlclVuaXQoaHUpOw0KKy8vCQlpZiAoaCA9PSBudWxsKSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRocm93IG5ldyBIZWxwZXJOb3RGb3VuZEV4Y2VwdGlvbigpIik7DQorLy8JCX0gZWxzZSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIC0gSGVscGVyOiAiICsgaC5nZXROYW1lKCkpOw0KKy8vCQl9DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgLSBSdW4gSGVscGVyIik7DQorCQlydW5IZWxwZXIoaHUsIGgpOw0KKwl9DQorCQ0KKwkvLyBuZWVkZWQNCisJcHJpdmF0ZSBJTXVsdGlGZWF0dXJlSGVscGVyIGdldElNdWx0aUZlYXR1cmVIZWxwZXJGcm9tTXVsdGlGZWF0dXJlSGVscGVyKA0KKwkJCU11bHRpRmVhdHVyZUhlbHBlciBoKSB7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiMSBiIGlpIC0gTG9hZCBJbnRlcmZhY2UgSU11bHRpRmVhdHVyZUhlbHBlciIpOw0KKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaU11bHRpRmVhdHVyZUhlbHBlcnMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpDQorCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihFeHRlbnNpb25Qb2ludEluZm8uTVVMVElGRUFUVVJFX0VYVEVOU0lPTl9QT0lOVCk7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC0gTnVtYmVyIG9mIG11bHRpZmVhdHVyZXM6ICIgKyBpTXVsdGlGZWF0dXJlSGVscGVycy5sZW5ndGgpOw0KKwkJSU11bHRpRmVhdHVyZUhlbHBlciBpbWZlaCA9IG51bGw7DQorCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBpY2UgOiBpTXVsdGlGZWF0dXJlSGVscGVycykgew0KKwkJCXRyeSB7DQorCQkJCVN0cmluZyBoZWxwZXJJZCA9IGguZ2V0SGVscGVySWQoKTsNCisJCQkJU3RyaW5nIGlkID0gaWNlLmdldEF0dHJpYnV0ZSgiaWQiKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIGlkIG9mIGhlbHBlcjogIiArIGhlbHBlcklkKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIGlkIG9mIGludGVyZmFjZTogIiArIGlkKTsNCisJCQkJaWYgKGhlbHBlcklkLmVxdWFscyhpZCkpIHsNCisJCQkJCWltZmVoICA9IChJTXVsdGlGZWF0dXJlSGVscGVyKSBpY2UuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsNCisJCQkJCWJyZWFrOw0KKwkJCQl9CQkJCQ0KKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCX0NCisJCX0NCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgLSBjbGFzcyBvZiBtdWx0aWZlYXR1cmU6ICIgKyBpbWZlaC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQorCQlyZXR1cm4gaW1mZWg7DQorCX0NCisNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgSVNpbmdsZUZpbHRlckhlbHBlciBnZXRJU2luZ2xlRmlsdGVySGVscGVyRnJvbVNpbmdsZUZpbHRlckhlbHBlcigNCisJCQlTaW5nbGVGaWx0ZXJIZWxwZXIgaCkgew0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIjEgYiBpaSAtIExvYWQgSW50ZXJmYWNlIElTaW5nbGVGaWx0ZXJIZWxwZXIiKTsNCisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGlTaW5nbGVGaWx0ZXJIZWxwZXJzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQ0KKwkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoRXh0ZW5zaW9uUG9pbnRJbmZvLlNJTkdMRUZJTFRFUl9FWFRFTlNJT05fUE9JTlQpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIE51bWJlciBvZiBzaW5nbGVmaWx0ZXJzOiAiICsgaVNpbmdsZUZpbHRlckhlbHBlcnMubGVuZ3RoKTsNCisJCUlTaW5nbGVGaWx0ZXJIZWxwZXIgaXNmaCA9IG51bGw7DQorCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBpY2UgOiBpU2luZ2xlRmlsdGVySGVscGVycykgew0KKwkJCXRyeSB7DQorCQkJCVN0cmluZyBoZWxwZXJJZCA9IGguZ2V0SGVscGVySWQoKTsNCisJCQkJU3RyaW5nIGlkID0gaWNlLmdldEF0dHJpYnV0ZSgiaWQiKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIGlkIG9mIGhlbHBlcjogIiArIGhlbHBlcklkKTsNCisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIGlkIG9mIGludGVyZmFjZTogIiArIGlkKTsNCisJCQkJaWYgKGhlbHBlcklkLmVxdWFscyhpZCkpIHsNCisJCQkJCWlzZmggID0gKElTaW5nbGVGaWx0ZXJIZWxwZXIpIGljZS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOw0KKwkJCQkJYnJlYWs7DQorCQkJCX0JCQkJDQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJfQ0KKwkJfQ0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtIGNsYXNzIG9mIHNpbmdsZWZpbHRlcjogIiArIGlzZmguZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KKwkJcmV0dXJuIGlzZmg7DQorCX0NCisNCisJLy8gbmVlZGVkDQorCXByaXZhdGUgSGVscGVyIGdldEhlbHBlckZyb21IZWxwZXJVbml0KEhlbHBlclVuaXQgaHUpIHsNCisJCWZvciAoSGVscGVyIGggOiB0aGlzLmhlbHBlcikgew0KKwkJCWlmIChoLmdldEhlbHBlcklkKCkuZXF1YWxzKGh1LmdldEhlbHBlclVuaXRJZCgpKSl7DQorCQkJCXJldHVybiBoOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8vIG5lZWRlZA0KKwlwcml2YXRlIGJvb2xlYW4gY2hlY2tQb3J0VmFsdWVzU2V0SW5IZWxwZXJVbml0KEhlbHBlclVuaXQgaHUpIHsNCisJCWlmIChodSBpbnN0YW5jZW9mIFNpbmdsZUZpbHRlclVuaXQpIHsNCisJCQlpZiAoKChTaW5nbGVGaWx0ZXJVbml0KSBodSkuZ2V0SW5wdXRQb3J0KCkuZ2V0VmFsdWUoKSA9PSBudWxsKSB7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQl9CQkNCisJCWlmIChodSBpbnN0YW5jZW9mIE11bHRpRmlsdGVyVW5pdCkgew0KKwkJCWlmICgoKE11bHRpRmlsdGVyVW5pdCkgaHUpLmdldElucHV0UG9ydCgpLmdldFZhbHVlKCkgPT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGh1IGluc3RhbmNlb2YgU2luZ2xlRmVhdHVyZVVuaXQpIHsNCisJCQlpZiAoKChTaW5nbGVGZWF0dXJlVW5pdCkgaHUpLmdldElucHV0UG9ydCgpLmdldFZhbHVlKCkgPT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQkJCQ0KKwkJCWZvciAoTXVsdGlJbnB1dFBvcnQgbWlwIDogKChTaW5nbGVGZWF0dXJlVW5pdCkgaHUpLmdldFNlY29uZGFyeUlucHV0UG9ydHMoKSkgew0KKwkJCQlpZiAobWlwLmdldFZhbHVlKCkgPT0gbnVsbCkgew0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGh1IGluc3RhbmNlb2YgTXVsdGlGZWF0dXJlVW5pdCkgew0KKwkJCWlmICgoKE11bHRpRmVhdHVyZVVuaXQpIGh1KS5nZXRJbnB1dFBvcnQoKS5nZXRWYWx1ZSgpID09IG51bGwpIHsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0JCQkNCisJCQlmb3IgKE11bHRpSW5wdXRQb3J0IG1pcCA6ICgoTXVsdGlGZWF0dXJlVW5pdCkgaHUpLmdldFNlY29uZGFyeUlucHV0UG9ydHMoKSkgew0KKwkJCQlpZiAobWlwLmdldFZhbHVlKCkgPT0gbnVsbCkgew0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9zcmMvY29tcmVsL2ludGVycHJldGVyL0NvbXJlbEludGVycHJldGVyUHJpbnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9zcmMvY29tcmVsL2ludGVycHJldGVyL0NvbXJlbEludGVycHJldGVyUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjMxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL3NyYy9jb21yZWwvaW50ZXJwcmV0ZXIvQ29tcmVsSW50ZXJwcmV0ZXJQcmludGVyLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBjb21yZWwuaW50ZXJwcmV0ZXI7DQorDQorcHVibGljIGNsYXNzIENvbXJlbEludGVycHJldGVyUHJpbnRlciB7DQorCQ0KKwlDb21yZWxJbnRlcnByZXRlciBjb21yZWxJbnRlcnByZXRlcjsNCisJDQorCXB1YmxpYyBDb21yZWxJbnRlcnByZXRlclByaW50ZXIoQ29tcmVsSW50ZXJwcmV0ZXIgY29tcmVsSW50ZXJwcmV0ZXIpIHsNCisJCXRoaXMuY29tcmVsSW50ZXJwcmV0ZXIgPSBjb21yZWxJbnRlcnByZXRlcjsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgcHJpbnRSZWZhY3RvcmluZ3MoKSB7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tIFJlZ2lzdGVyZWQgUmVmYWN0b3JpbmdzIC0tLS0tLS0iKTsNCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQorLy8JCWZvciAoRW1mUmVmYWN0b3JpbmcgcmVmIDogY29tcmVsSW50ZXJwcmV0ZXIuZW1mUmVmYWN0b3JpbmdzKSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVmLmdldElkKCkpOw0KKy8vCQl9DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBwcmludEhlbHBlcigpIHsNCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLSBSZWdpc3RlcmVkIEhlbHBlciAtLS0tLS0tLS0tLSIpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisvLwkJZm9yIChIZWxwZXIgaGVsIDogY29tcmVsSW50ZXJwcmV0ZXIuaGVscGVyKSB7DQorLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oaGVsLmdldE5hbWUoKSk7DQorLy8JCX0NCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHByaW50Um9vdE9iamVjdCgpIHsNCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLSBSb290IE1vZGVsIE9iamVjdCAtLS0tLS0tLS0tLSIpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKGNvbXJlbEludGVycHJldGVyLnJvb3RPYmplY3QudG9TdHJpbmcoKSk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBwcmludENoZWNrUHJlY29uZGl0aW9ucygpIHsNCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLSBGbGFnIFByZWNvbmRpdGlvbnMgQ2hlY2sgLS0tLSIpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKGNvbXJlbEludGVycHJldGVyLmNoZWNrUHJlY29uZGl0aW9ucyk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBwcmludENvbXBvc2l0ZVJlZmFjdG9yaW5nKCkgew0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tIENvbXBvc2l0ZSBSZWZhY3RvcmluZyAtLS0tLS0tIik7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY29tcmVsSW50ZXJwcmV0ZXIuY29tcG9zaXRlUmVmYWN0b3JpbmcpOw0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgcHJpbnRNYWluUmVmYWN0b3JpbmdVbml0KCkgew0KKwkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLSBNYWluIFJlZmFjdG9yaW5nIFVuaXQgLS0tLS0tIik7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY29tcmVsSW50ZXJwcmV0ZXIubWFpblJlZmFjdG9yaW5nVW5pdCk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvc3JjL2NvbXJlbC9pbnRlcnByZXRlci9Db21yZWxJbnRlcnByZXRlclRlc3Rlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC5pbnRlcnByZXRlci9zcmMvY29tcmVsL2ludGVycHJldGVyL0NvbXJlbEludGVycHJldGVyVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwM2JlYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvc3JjL2NvbXJlbC9pbnRlcnByZXRlci9Db21yZWxJbnRlcnByZXRlclRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2UgY29tcmVsLmludGVycHJldGVyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1vZGVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOw0KKw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21yZWxJbnRlcnByZXRlclRlc3RlciB7DQorDQorCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0SW50ZXJwcmV0ZXJJbml0KCkgew0KKwkJTW9kZWwgdW1sTW9kZWw7DQorCQl1bWxNb2RlbCA9IGxvYWRVbWxNb2RlbCgiRDovVW5pL0VjbGlwc2Uvc2NtL3dzL2NvbXJlbC5pbnRlcnByZXRlci9tb2RlbHMvTXkudW1sIik7DQorCQlDb21yZWxJbnRlcnByZXRlciBjb21yZWxJbnRlcnByZXRlciA9IG5ldyBDb21yZWxJbnRlcnByZXRlcih1bWxNb2RlbCk7DQorCQlDb21yZWxJbnRlcnByZXRlclByaW50ZXIgcHJpbnRlciA9IG5ldyBDb21yZWxJbnRlcnByZXRlclByaW50ZXIoY29tcmVsSW50ZXJwcmV0ZXIpOw0KKwkJcHJpbnRlci5wcmludFJvb3RPYmplY3QoKTsNCisJCXByaW50ZXIucHJpbnRSZWZhY3RvcmluZ3MoKTsNCisJCXByaW50ZXIucHJpbnRIZWxwZXIoKTsNCisJCXRyeSB7DQorCQkJY29tcmVsSW50ZXJwcmV0ZXIubG9hZENvbXJlbE1vZGVsKCJEOi9VbmkvRWNsaXBzZS9zY20vd3MvY29tcmVsLmludGVycHJldGVyL21vZGVscy9leHRyYWN0c3VwZXJjbGFzcy5jb21yZWwiKTsNCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwkJcHJpbnRlci5wcmludENvbXBvc2l0ZVJlZmFjdG9yaW5nKCk7DQorCQlwcmludGVyLnByaW50TWFpblJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJcHJpbnRlci5wcmludENoZWNrUHJlY29uZGl0aW9ucygpOw0KKwl9DQorCQ0KKwlwcml2YXRlIHN0YXRpYyBNb2RlbCBsb2FkVW1sTW9kZWwoU3RyaW5nIGZpbGVOYW1lKSB7DQorCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkgcmVnID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRTsNCisJCU1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IHJlZy5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKTsNCisJCW0ucHV0KCJ1bWwiLCBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsNCisJCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcgRmlsZShmaWxlTmFtZSkuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KKwkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7DQorCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7DQorCQl0cnkgew0KKwkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsNCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KKwkJfQ0KKwkJTW9kZWwgbW9kZWwgPSAoTW9kZWwpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOyANCisJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kZWw6ICIgKyBtb2RlbC50b1N0cmluZygpKTsNCisJCXJldHVybiBtb2RlbDsNCisJfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL3NyYy9jb21yZWwvaW50ZXJwcmV0ZXIvSUVPYmplY3RHZXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwuaW50ZXJwcmV0ZXIvc3JjL2NvbXJlbC9pbnRlcnByZXRlci9JRU9iamVjdEdldHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Zjk1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLmludGVycHJldGVyL3NyYy9jb21yZWwvaW50ZXJwcmV0ZXIvSUVPYmplY3RHZXR0ZXIuamF2YQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2UgY29tcmVsLmludGVycHJldGVyOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitwdWJsaWMgaW50ZXJmYWNlIElFT2JqZWN0R2V0dGVyIHsNCisJDQorCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoKTsNCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmJjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0phdmFTRS0xLjYiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KKzwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2U3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHByb2plY3REZXNjcmlwdGlvbj4NCisJPG5hbWU+b3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbDwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvLnNldHRpbmdzL2NvbXJlbC5nbWZnZW4ucHJlZnMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLy5zZXR0aW5ncy9jb21yZWwuZ21mZ2VuLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYmM1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLy5zZXR0aW5ncy9jb21yZWwuZ21mZ2VuLnByZWZzCkBAIC0wLDAgKzEsNyBAQAorI0ZyaSBTZXAgMTYgMTc6NDM6MTggQ0VTVCAyMDExDQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitnZW5lcmF0ZV9yY3A9ZmFsc2UNCitpZ25vcmVfZ21mZ2VuX3ZhbGlkYXRpb249ZmFsc2UNCitpZ25vcmVfbWFwbW9kZWxfdmFsaWRhdGlvbj1mYWxzZQ0KK3VzZV9tYXBfbW9kZT10cnVlDQordXNlX3J1bnRpbWVfZmlndXJlcz10cnVlDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuZ21mLmJyaWRnZS51aS5kYXNoYm9hcmQucHJlZnMgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5nbWYuYnJpZGdlLnVpLmRhc2hib2FyZC5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM0YTAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuZ21mLmJyaWRnZS51aS5kYXNoYm9hcmQucHJlZnMKQEAgLTAsMCArMSw0IEBACisjRnJpIFNlcCAxNiAxNzo0MTo1MCBDRVNUIDIwMTENCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK2dtZl9kYXNoYm9hcmQvZG9tYWluR2VuZXJhdGlvbk1vZGVsPXBsYXRmb3JtXDovcmVzb3VyY2UvY29tcmVsL21vZGVsL2NvbXJlbC5nZW5tb2RlbA0KK2dtZl9kYXNoYm9hcmQvZG9tYWluTW9kZWw9cGxhdGZvcm1cOi9yZXNvdXJjZS9jb21yZWwvbW9kZWwvY29tcmVsLmVjb3JlDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwZDk4NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyMCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1OYW1lOiBDb01SZUwNCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsO3NpbmdsZXRvbjo9dHJ1ZQ0KK0J1bmRsZS1WZXJzaW9uOiAwLjkuMA0KK0J1bmRsZS1DbGFzc1BhdGg6IC4NCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNg0KK0V4cG9ydC1QYWNrYWdlOiBjb21yZWwsDQorIGNvbXJlbC5leHRlbnNpb25zLA0KKyBjb21yZWwuZmlndXJlcywNCisgY29tcmVsLmltcGwsDQorIGNvbXJlbC51dGlsDQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LA0KKyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk7YnVuZGxlLXZlcnNpb249IjEuNC4xIiwNCisgb3JnLmVjbGlwc2UuZHJhdzJkO2J1bmRsZS12ZXJzaW9uPSIzLjYuMiIsDQorIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSIzLjUuMTAwIiwNCisgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSIwLjcuMCINCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvYmluLy5naXRpZ25vcmUgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL2Jpbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGRiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL2Jpbi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKy9jb21yZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU3OTliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTcgQEAKKw0KKyMgPGNvcHlyaWdodD4NCisjIDwvY29weXJpZ2h0Pg0KKyMNCisjICRJZCQNCisNCitiaW4uaW5jbHVkZXMgPSAuLFwNCisgICAgICAgICAgICAgICBtb2RlbC8sXA0KKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KKyAgICAgICAgICAgICAgIHNjaGVtYS8sXA0KKyAgICAgICAgICAgICAgIHNyYy8sXA0KKyAgICAgICAgICAgICAgIGJpbi8NCitqYXJzLmNvbXBpbGUub3JkZXIgPSAuDQorc291cmNlLi4gPSBzcmMvDQorb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9FQ29yZTJHTUYuZW9sIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9FQ29yZTJHTUYuZW9sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzA5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL0VDb3JlMkdNRi5lb2wKQEAgLTAsMCArMSw5MSBAQAorDQorLS0gbmVubnQgZGllIGRlZmF1bHQtR3J1cHBlIGluICdVbml0cycgdW0NCit2YXIgdG9vbEdyb3VwVW5pdCA9IEdtZlRvb2whVG9vbEdyb3VwLmFsbC5zZWxlY3RPbmUocnxyLnRpdGxlID0gJ09iamVjdHMnKTsNCit0b29sR3JvdXBVbml0LnRpdGxlPSdDb21wb3NpdGUgVW5pdHMnOw0KKw0KKy0tIGVyc3RlbGx0IGRpZSBUb29sLUdyb3VwIENvbm5lY3RvcmVuDQorLS0gdmFyIHRvb2xHcm91cENvbm5lY3RvcmVuID0gbmV3IEdtZlRvb2whVG9vbEdyb3VwOw0KKy0tIHRvb2xHcm91cENvbm5lY3RvcmVuLnRpdGxlID0gJ0Nvbm5lY3RvcmVuJzsNCistLSB0b29sR3JvdXBDb25uZWN0b3Jlbi5jb2xsYXBzaWJsZSA9IHRydWU7DQorDQorLS0gZXJzdGVsbHQgZGllIFRvb2wtR3JvdXAgQXRvbWljVW5pdHMNCit2YXIgdG9vbEdyb3VwQXRvbWljVW5pdHMgPSBuZXcgR21mVG9vbCFUb29sR3JvdXA7DQordG9vbEdyb3VwQXRvbWljVW5pdHMudGl0bGUgPSAnQXRvbWljIFVuaXRzJzsNCit0b29sR3JvdXBBdG9taWNVbml0cy5jb2xsYXBzaWJsZSA9IHRydWU7DQorDQorLS0gZXJzdGVsbHQgZGllIFRvb2wtR3JvdXAgRmlsdGVyVW5pdHMNCit2YXIgdG9vbEdyb3VwRmlsdGVyID0gbmV3IEdtZlRvb2whVG9vbEdyb3VwOw0KK3Rvb2xHcm91cEZpbHRlci50aXRsZSA9ICdGaWx0ZXIgVW5pdHMnOw0KK3Rvb2xHcm91cEZpbHRlci5jb2xsYXBzaWJsZSA9IHRydWU7DQorDQorLS0gZXJzdGVsbHQgZGllIFRvb2wtR3JvdXAgU2luZ2xlRmVhdHVyZVVuaXRzDQordmFyIHRvb2xHcm91cEZlYXR1cmUgPSBuZXcgR21mVG9vbCFUb29sR3JvdXA7DQordG9vbEdyb3VwRmVhdHVyZS50aXRsZSA9ICdGZWF0dXJlIFVuaXRzJzsNCit0b29sR3JvdXBGZWF0dXJlLmNvbGxhcHNpYmxlID0gdHJ1ZTsNCisNCistLSBzdWNodCBhdXMgYWxsZW4gVG9vbHMgZGllIENvbm5lY3RvcmVuIHJhdXMgdW5kIGb8Z3Qgc2llIGRlciBDb25uZWN0b3Jlbi1Ub29sX2dyb3VwIGhpbnp1DQordmFyIGF0b21pY3MgPSB0b29sR3JvdXBVbml0LmdldFRvb2xzKCkuc2VsZWN0KHQgfCB0LnRpdGxlLmVuZHNXaXRoKCdBdG9taWNVbml0JykpOw0KK3Rvb2xHcm91cEF0b21pY1VuaXRzLnRvb2xzLmFkZEFsbChhdG9taWNzKTsNCisNCistLSBzdWNodCBhdXMgYWxsZW4gVG9vbHMgZGllIEZlYXR1cmVzIHJhdXMgdW5kIGb8Z3Qgc2llIGRlciBTaW5nbGVGZWF0dXJlLVRvb2xfZ3JvdXAgaGluenUNCit2YXIgZmVhdHVyZSA9IHRvb2xHcm91cFVuaXQuZ2V0VG9vbHMoKS5zZWxlY3QodCB8IHQudGl0bGUuZW5kc1dpdGgoJ0ZlYXR1cmVVbml0JykpOw0KK3Rvb2xHcm91cEZlYXR1cmUudG9vbHMuYWRkQWxsKGZlYXR1cmUpOw0KKw0KKy0tIHN1Y2h0IGF1cyBhbGxlbiBUb29scyBkaWUgRmlsdGVyIHJhdXMgdW5kIGb8Z3Qgc2llIGRlciBGaWx0ZXItVG9vbF9ncm91cCBoaW56dQ0KK3ZhciBmaWx0ZXIgPSB0b29sR3JvdXBVbml0LmdldFRvb2xzKCkuc2VsZWN0KHQgfCB0LnRpdGxlLmVuZHNXaXRoKCdGaWx0ZXJVbml0JykpOw0KK3Rvb2xHcm91cEZpbHRlci50b29scy5hZGRBbGwoZmlsdGVyKTsNCisNCisNCistLSBlcnN0ZWxsdCBkaWUgVG9vbC1Hcm91cCBQb3J0cw0KK3ZhciB0b29sR3JvdXBQb3J0PSBuZXcgR21mVG9vbCFUb29sR3JvdXA7DQordG9vbEdyb3VwUG9ydC50aXRsZT0nUG9ydHMnOw0KK3Rvb2xHcm91cFBvcnQuY29sbGFwc2libGUgPSB0cnVlOw0KKw0KKy0tIHN1Y2h0IGF1cyBhbGxlbiBUb29scyBkaWUgUG9ydHMgcmF1cyB1bmQgZvxndCBzaWUgZGVyIFBvcnRzLVRvb2wtR3JvdXAgaGluenUNCisNCistLSB2YXIgcG9ydHNXZWcgPSB0b29sR3JvdXBVbml0LmdldFRvb2xzKCkuc2VsZWN0KHQgfCB0LnRpdGxlLmVuZHNXaXRoKCdPdXRwdXRQb3J0JykpOw0KKy0tIGRlbGV0ZSBwb3J0c1dlZzsNCit2YXIgcG9ydHMgPSB0b29sR3JvdXBVbml0LmdldFRvb2xzKCkuc2VsZWN0KHQgfCB0LnRpdGxlLmVuZHNXaXRoKCdQb3J0JykpOw0KK3Rvb2xHcm91cFBvcnQudG9vbHMuYWRkQWxsKHBvcnRzKTsNCisNCistLSBTdWNodCBkaWUgUGFsZXR0ZSB1bmQgZvxndCBkaWUgUG9ydHMtICYgQ29ubmVjdG9yZW4tVG9vbC1Hcm91cCBoaW56dQ0KK3ZhciBwYWxldHRlID0gR21mVG9vbCFQYWxldHRlLmFsbC5zZWxlY3RPbmUociB8IHIudGl0bGUgPSAnY29tcmVsUGFsZXR0ZScpOw0KK3BhbGV0dGUudG9vbHMuYWRkKHRvb2xHcm91cEF0b21pY1VuaXRzKTsNCitwYWxldHRlLnRvb2xzLmFkZCh0b29sR3JvdXBGaWx0ZXIpOw0KK3BhbGV0dGUudG9vbHMuYWRkKHRvb2xHcm91cEZlYXR1cmUpOw0KK3BhbGV0dGUudG9vbHMuYWRkKHRvb2xHcm91cFBvcnQpOw0KKw0KKy0tIFN1Y2h0IGRpZSBNYXBwaW5ncy1Ub29sZ3JvdXAsIGVudGZlcm50IHNpZSB1bmQgZvxndCBzaWUgd2llZGVyIGhpbnp1IChkYW1pdCBzaWUgYW0gRW5kZSBzdGVodCkNCit2YXIgdG9vbEdyb3VwTWFwcGluZyA9IEdtZlRvb2whVG9vbEdyb3VwLmFsbC5zZWxlY3RPbmUocnxyLnRpdGxlID0gJ0Nvbm5lY3Rpb25zJyk7DQordG9vbEdyb3VwTWFwcGluZy50aXRsZSA9ICdNYXBwaW5ncyc7DQorcGFsZXR0ZS50b29scy5yZW1vdmUodG9vbEdyb3VwTWFwcGluZyk7DQorcGFsZXR0ZS50b29scy5hZGQodG9vbEdyb3VwTWFwcGluZyk7DQorDQorLS0gTGlua0NvbnN0cmFpbnRzIGb8ciBkYXMgU0luZ2xlUG9ydE1hcHBpbmctTWFwcGluZw0KK3ZhciBzaW5nbGVQb3J0TWFwcGluZ0NvbnN0cmFpbnQgPSBuZXcgR21mTWFwIUxpbmtDb25zdHJhaW50czsNCit2YXIgc2luZ2xlU291cmNlQ29uc3RyYWludCA9IG5ldyBHbWZNYXAhQ29uc3RyYWludDsNCitzaW5nbGVTb3VyY2VDb25zdHJhaW50LmJvZHkgPSAnc2VsZjw+b3Bwb3NpdGVFbmQnOw0KK3NpbmdsZVBvcnRNYXBwaW5nQ29uc3RyYWludC5zZXRTb3VyY2VFbmQoc2luZ2xlU291cmNlQ29uc3RyYWludCk7DQorDQordmFyIHNpbmdsZVBvcnRNYXBwaW5nVG9vbCA9IHRvb2xHcm91cE1hcHBpbmcudG9vbHMuc2VsZWN0T25lKG0gfCBtLnRpdGxlPSdTaW5nbGVQb3J0TWFwcGluZycpOw0KKw0KK3ZhciBzaW5nbGVQb3J0TWFwcGluZ01hcHBpbmcgPSBHbWZNYXAhTGlua01hcHBpbmcuYWxsLnNlbGVjdE9uZShtIHwgbS50b29sID0gc2luZ2xlUG9ydE1hcHBpbmdUb29sKTsNCitzaW5nbGVQb3J0TWFwcGluZ01hcHBpbmcuc2V0Q3JlYXRpb25Db25zdHJhaW50cyhzaW5nbGVQb3J0TWFwcGluZ0NvbnN0cmFpbnQpOw0KKw0KKy0tIExpbmtDb25zdHJhaW50cyBm/HIgZGFzIE11bHRpUG9ydE1hcHBpbmctTWFwcGluZw0KK3ZhciBtdWx0aVBvcnRNYXBwaW5nQ29uc3RyYWludCA9IG5ldyBHbWZNYXAhTGlua0NvbnN0cmFpbnRzOw0KK3ZhciBtdWx0aVNvdXJjZUNvbnN0cmFpbnQgPSBuZXcgR21mTWFwIUNvbnN0cmFpbnQ7DQorbXVsdGlTb3VyY2VDb25zdHJhaW50LmJvZHkgPSAnc2VsZjw+b3Bwb3NpdGVFbmQnOw0KK211bHRpUG9ydE1hcHBpbmdDb25zdHJhaW50LnNldFNvdXJjZUVuZChtdWx0aVNvdXJjZUNvbnN0cmFpbnQpOw0KK3ZhciBtdWx0aVBvcnRNYXBwaW5nVG9vbCA9IHRvb2xHcm91cE1hcHBpbmcudG9vbHMuc2VsZWN0T25lKG0gfCBtLnRpdGxlPSdNdWx0aVBvcnRNYXBwaW5nJyk7DQordmFyIG11bHRpUG9ydE1hcHBpbmdNYXBwaW5nID0gR21mTWFwIUxpbmtNYXBwaW5nLmFsbC5zZWxlY3RPbmUobSB8IG0udG9vbCA9IG11bHRpUG9ydE1hcHBpbmdUb29sKTsNCittdWx0aVBvcnRNYXBwaW5nTWFwcGluZy5zZXRDcmVhdGlvbkNvbnN0cmFpbnRzKG11bHRpUG9ydE1hcHBpbmdDb25zdHJhaW50KTsNCisNCistLSBMaW5rQ29uc3RyYWludHMgZvxyIGRhcyBtdWx0aVNpbmdsZVBvcnRNYXBwaW5nLU1hcHBpbmcNCit2YXIgbXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NvbnN0cmFpbnQgPSBuZXcgR21mTWFwIUxpbmtDb25zdHJhaW50czsNCit2YXIgbXVsdGlTaW5nbGVTb3VyY2VDb25zdHJhaW50ID0gbmV3IEdtZk1hcCFDb25zdHJhaW50Ow0KK211bHRpU2luZ2xlU291cmNlQ29uc3RyYWludC5ib2R5ID0gJ3NlbGY8Pm9wcG9zaXRlRW5kJzsNCittdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ29uc3RyYWludC5zZXRTb3VyY2VFbmQobXVsdGlTaW5nbGVTb3VyY2VDb25zdHJhaW50KTsNCit2YXIgbXVsdGlTaW5nbGVQb3J0TWFwcGluZ1Rvb2wgPSB0b29sR3JvdXBNYXBwaW5nLnRvb2xzLnNlbGVjdE9uZShtIHwgbS50aXRsZT0nTXVsdGlTaW5nbGVQb3J0TWFwcGluZycpOw0KK3ZhciBtdWx0aVNpbmdsZVBvcnRNYXBwaW5nTWFwcGluZyA9IEdtZk1hcCFMaW5rTWFwcGluZy5hbGwuc2VsZWN0T25lKG0gfCBtLnRvb2wgPSBtdWx0aVNpbmdsZVBvcnRNYXBwaW5nVG9vbCk7DQorbXVsdGlTaW5nbGVQb3J0TWFwcGluZ01hcHBpbmcuc2V0Q3JlYXRpb25Db25zdHJhaW50cyhtdWx0aVNpbmdsZVBvcnRNYXBwaW5nQ29uc3RyYWludCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwuZWNvcmUgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ1YTQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwuZWNvcmUKQEAgLTAsMCArMSw1MjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImNvbXJlbCINCisgICAgbnNVUkk9Imh0dHA6Ly9jb21yZWwvMC4xIiBuc1ByZWZpeD0iY29tcmVsIj4NCisgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYiPg0KKyAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgPC9lQW5ub3RhdGlvbnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbXBvc2l0ZVJlZmFjdG9yaW5nIiBlU3VwZXJUeXBlcz0iIy8vTW9kZWxSZWZhY3RvcmluZyI+DQorICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuZGlhZ3JhbSI+DQorICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9Im9uZWZpbGUiIHZhbHVlPSJmYWxzZSIvPg0KKyAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1haW5SZWZhY3RvcmluZ1VuaXQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vUmVmYWN0b3JpbmdVbml0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9ydE1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSINCisgICAgICAgIGVUeXBlPSIjLy9Qb3J0TWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGVsUmVmYWN0b3JpbmdzIiB1cHBlckJvdW5kPSItMSINCisgICAgICAgIGVUeXBlPSIjLy9Nb2RlbFJlZmFjdG9yaW5nIiBjb250YWlubWVudD0idHJ1ZSIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGVscGVyIiB1cHBlckJvdW5kPSItMSINCisgICAgICAgIGVUeXBlPSIjLy9IZWxwZXIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBwaW5nVmlzdWFsaXphdGlvbiIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9NYXBwaW5nVmlzdWFsaXphdGlvbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMCIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VzdG9tSW5pdGlhbENvbmRpdGlvbiINCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1c3RvbUZpbmFsQ29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmliZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmYWN0b3JpbmdVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+DQorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRBbGxJbnB1dFBvcnRzIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lucHV0UG9ydCIvPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0U2VxRXhlY3V0aW9uT3JkZXIiPg0KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJzZXFFeGVjdXRpb25PcmRlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPg0KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJzdXBlckNhbGwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQorICAgIDwvZU9wZXJhdGlvbnM+DQorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXROYW1lIj4NCisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmV3TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ1cGRhdGVDb250YWluZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQorICAgIDwvZU9wZXJhdGlvbnM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXFFeGVjdXRpb25PcmRlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZGVsUmVmYWN0b3JpbmciIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQgIy8vRGVzY3JpYmVkRWxlbWVudCI+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZJZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFiZWwiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVyaSIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlucHV0UG9ydHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL1NpbmdsZUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdG9taWNVbml0IiBlU3VwZXJUeXBlcz0iIy8vUmVmYWN0b3JpbmdVbml0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwuaWNvbiIgdmFsdWU9ImZhbHNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbCIgdmFsdWU9ImxhYmVsLHR5cGUiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9Ii8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5wdXRQb3J0cyIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2luZ2xlSW5wdXRQb3J0IiBjb250YWlubWVudD0idHJ1ZSI+DQorICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5hZmZpeGVkIj4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXRJZCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhYmVsIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVcmkiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIg0KKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkF0b21pYyBVbml0Ii8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RlbFJlZmFjdG9yaW5nIiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgZVR5cGU9IiMvL01vZGVsUmVmYWN0b3JpbmciLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWciDQorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoZWNrRmluYWxDb25kaXRpb25GbGFnIg0KKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9SZWZhY3RvcmluZ1VuaXQiLz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VxdWVudGlhbFVuaXQiIGVTdXBlclR5cGVzPSIjLy9Db21wb3NpdGVVbml0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwuaWNvbiIgdmFsdWU9ImZhbHNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbCIgdmFsdWU9Im5hbWUsdHlwZSxsYmxTdHJpY3QiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9IC17Mn0tIi8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idXBkYXRlU2VxRXhlY3V0aW9uT3JkZXIiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhlbHBlclVuaXRzIiB1cHBlckJvdW5kPSItMSINCisgICAgICAgIGVUeXBlPSIjLy9IZWxwZXJVbml0IiBjb250YWlubWVudD0idHJ1ZSI+DQorICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5jb21wYXJ0bWVudCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZhY3RvcmluZ1VuaXRzIiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZhY3RvcmluZ1VuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmNvbXBhcnRtZW50Ij4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlucHV0UG9ydHMiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdHJpY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIg0KKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyINCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJTZXF1ZW50aWFsIFVuaXQiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxibFN0cmljdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyINCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InN0cmljdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbmRpdGlvbkNoZWNrIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50ICMvL0Rlc2NyaWJlZEVsZW1lbnQiPg0KKyAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLm5vZGUiPg0KKyAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbC5pY29uIiB2YWx1ZT0iZmFsc2UiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsIiB2YWx1ZT0ibmFtZSx0eXBlLHNwZWMiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9IC17Mn0tIi8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyINCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJDb25kaXRpb24gQ2hlY2siLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25kaXRpb25hbFVuaXQiIGVTdXBlclR5cGVzPSIjLy9Db21wb3NpdGVVbml0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwuaWNvbiIgdmFsdWU9ImZhbHNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbCIgdmFsdWU9Im5hbWUsdHlwZSIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwucGF0dGVybiIgdmFsdWU9InswfTp7MX0iLz4NCisgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZiIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0NvbmRpdGlvbkNoZWNrIg0KKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuY29tcGFydG1lbnQiPg0KKyAgICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGVscGVyVW5pdHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL0hlbHBlclVuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmNvbXBhcnRtZW50Ij4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRoZW4iIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9SZWZhY3RvcmluZ1VuaXQiDQorICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+DQorICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5jb21wYXJ0bWVudCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbHNlIiBlVHlwZT0iIy8vUmVmYWN0b3JpbmdVbml0Ig0KKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuY29tcGFydG1lbnQiPg0KKyAgICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5wdXRQb3J0cyIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSW5wdXRQb3J0IiBjb250YWlubWVudD0idHJ1ZSI+DQorICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5hZmZpeGVkIj4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciDQorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iQ29uZGl0aW9uYWwgVW5pdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlF1ZXVlZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29tcG9zaXRlVW5pdCI+DQorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpbml0Ii8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdHJpY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIg0KKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbmdsZVF1ZXVlZFVuaXQiIGVTdXBlclR5cGVzPSIjLy9RdWV1ZWRVbml0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwuaWNvbiIgdmFsdWU9ImZhbHNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbCIgdmFsdWU9Im5hbWUsdHlwZSxsYmxTdHJpY3QiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9IC17Mn0tIi8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGVscGVyVW5pdHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL0hlbHBlclVuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmNvbXBhcnRtZW50Ij4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmFjdG9yaW5nVW5pdCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9SZWZhY3RvcmluZ1VuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmNvbXBhcnRtZW50Ij4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpbmdsZUlucHV0UG9ydHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL1NpbmdsZUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtdWx0aUlucHV0UG9ydCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9NdWx0aUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIg0KKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlNpbmdsZSBRdWV1ZWQgVW5pdCIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGJsU3RyaWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIg0KKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ic3RyaWN0Ii8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHdpY2VkUXVldWVkVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9RdWV1ZWRVbml0Ii8+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQiIGVTdXBlclR5cGVzPSIjLy9Ud2ljZWRRdWV1ZWRVbml0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwuaWNvbiIgdmFsdWU9ImZhbHNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbCIgdmFsdWU9Im5hbWUsdHlwZSxsYmxTdHJpY3QiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9IC17Mn0tIi8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGVscGVyVW5pdHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL0hlbHBlclVuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmNvbXBhcnRtZW50Ij4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmFjdG9yaW5nVW5pdCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9SZWZhY3RvcmluZ1VuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmNvbXBhcnRtZW50Ij4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpbmdsZUlucHV0UG9ydHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL1NpbmdsZUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtdWx0aUlucHV0UG9ydHMiIGxvd2VyQm91bmQ9IjIiDQorICAgICAgICB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vTXVsdGlJbnB1dFBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmFmZml4ZWQiPg0KKyAgICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyINCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJDYXJ0ZXNpYW4gUXVldWVkIFVuaXQiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxibFN0cmljdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyINCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InN0cmljdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhcmFsbGVsUXVldWVkVW5pdCIgZVN1cGVyVHlwZXM9IiMvL1R3aWNlZFF1ZXVlZFVuaXQiPg0KKyAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLm5vZGUiPg0KKyAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbC5pY29uIiB2YWx1ZT0iZmFsc2UiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsIiB2YWx1ZT0ibmFtZSx0eXBlLGxibFN0cmljdCIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwucGF0dGVybiIgdmFsdWU9InswfTp7MX0gLXsyfS0iLz4NCisgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoZWxwZXJVbml0cyIgdXBwZXJCb3VuZD0iLTEiDQorICAgICAgICBlVHlwZT0iIy8vSGVscGVyVW5pdCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuY29tcGFydG1lbnQiPg0KKyAgICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmYWN0b3JpbmdVbml0cyIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9SZWZhY3RvcmluZ1VuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmNvbXBhcnRtZW50Ij4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNpbmdsZUlucHV0UG9ydHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL1NpbmdsZUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtdWx0aUlucHV0UG9ydHMiIGxvd2VyQm91bmQ9IjIiDQorICAgICAgICB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vTXVsdGlJbnB1dFBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIj4NCisgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmFmZml4ZWQiPg0KKyAgICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyINCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJQYXJhbGxlbCBRdWV1ZWQgVW5pdCIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGJsU3RyaWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIg0KKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ic3RyaWN0Ii8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSGVscGVyVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQgIy8vRGVzY3JpYmVkRWxlbWVudCI+DQorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbnB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9JbnB1dFBvcnQiLz4NCisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE91dHB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9PdXRwdXRQb3J0Ii8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWxwZXJVbml0SWQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVcmkiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmVhdHVyZVVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSGVscGVyVW5pdCIvPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW5nbGVGZWF0dXJlVW5pdCIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVVbml0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwuaWNvbiIgdmFsdWU9ImZhbHNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbCIgdmFsdWU9Im5hbWUsdHlwZSIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwucGF0dGVybiIgdmFsdWU9InswfTp7MX0iLz4NCisgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vU2luZ2xlSW5wdXRQb3J0IiBjb250YWlubWVudD0idHJ1ZSI+DQorICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5hZmZpeGVkIj4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY29uZGFyeUlucHV0UG9ydHMiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9IiMvL011bHRpSW5wdXRQb3J0IiBjb250YWlubWVudD0idHJ1ZSI+DQorICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5hZmZpeGVkIj4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vU2luZ2xlT3V0cHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzaW5nbGVGZWF0dXJlSGVscGVyIiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgZVR5cGU9IiMvL1NpbmdsZUZlYXR1cmVIZWxwZXIiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciDQorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iU2luZ2xlIEZlYXR1cmUgVW5pdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik11bHRpRmVhdHVyZVVuaXQiIGVTdXBlclR5cGVzPSIjLy9GZWF0dXJlVW5pdCI+DQorICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYubm9kZSI+DQorICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLmljb24iIHZhbHVlPSJmYWxzZSIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwiIHZhbHVlPSJuYW1lLHR5cGUiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9Ii8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5wdXRQb3J0IiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgZVR5cGU9IiMvL1NpbmdsZUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNvbmRhcnlJbnB1dFBvcnRzIiB1cHBlckJvdW5kPSItMSINCisgICAgICAgIGVUeXBlPSIjLy9NdWx0aUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXRQb3J0IiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgZVR5cGU9IiMvL011bHRpT3V0cHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtdWx0aUZlYXR1cmVIZWxwZXIiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vTXVsdGlGZWF0dXJlSGVscGVyIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIg0KKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ik11bHRpIEZlYXR1cmUgVW5pdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZpbHRlclVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSGVscGVyVW5pdCIvPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW5nbGVGaWx0ZXJVbml0IiBlU3VwZXJUeXBlcz0iIy8vRmlsdGVyVW5pdCI+DQorICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYubm9kZSI+DQorICAgICAgPGRldGFpbHMga2V5PSJmb28iIHZhbHVlPSJiYXIiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLmljb24iIHZhbHVlPSJmYWxzZSIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwiIHZhbHVlPSJuYW1lLHR5cGUiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9Ii8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5wdXRQb3J0IiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgZVR5cGU9IiMvL011bHRpSW5wdXRQb3J0IiBjb250YWlubWVudD0idHJ1ZSI+DQorICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5hZmZpeGVkIj4NCisgICAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vU2luZ2xlT3V0cHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzaW5nbGVGaWx0ZXJIZWxwZXIiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vU2luZ2xlRmlsdGVySGVscGVyIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIg0KKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlNpbmdsZSBGaWx0ZXIgVW5pdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik11bHRpRmlsdGVyVW5pdCIgZVN1cGVyVHlwZXM9IiMvL0ZpbHRlclVuaXQiPg0KKyAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLm5vZGUiPg0KKyAgICAgIDxkZXRhaWxzIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbC5pY29uIiB2YWx1ZT0iZmFsc2UiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsIiB2YWx1ZT0ibmFtZSx0eXBlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJsYWJlbC5wYXR0ZXJuIiB2YWx1ZT0iezB9OnsxfSIvPg0KKyAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImlucHV0UG9ydCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9NdWx0aUlucHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXRQb3J0IiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgZVR5cGU9IiMvL011bHRpT3V0cHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiPg0KKyAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYuYWZmaXhlZCI+DQorICAgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtdWx0aUZpbHRlckhlbHBlciIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9NdWx0aUZpbHRlckhlbHBlciIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyINCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJNdWx0aSBGaWx0ZXIgVW5pdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhlbHBlciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQgIy8vRGVzY3JpYmVkRWxlbWVudCI+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWxwZXJJZCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVyaSIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGZWF0dXJlSGVscGVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0hlbHBlciI+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vU2luZ2xlSW5wdXRQb3J0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2Vjb25kYXJ5SW5wdXRQb3J0cyIgdXBwZXJCb3VuZD0iLTEiDQorICAgICAgICBlVHlwZT0iIy8vTXVsdGlJbnB1dFBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2luZ2xlRmVhdHVyZUhlbHBlciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVIZWxwZXIiPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0UG9ydCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9TaW5nbGVPdXRwdXRQb3J0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik11bHRpRmVhdHVyZUhlbHBlciIgZVN1cGVyVHlwZXM9IiMvL0ZlYXR1cmVIZWxwZXIiPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0UG9ydCIgbG93ZXJCb3VuZD0iMSINCisgICAgICAgIGVUeXBlPSIjLy9NdWx0aU91dHB1dFBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmlsdGVySGVscGVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0hlbHBlciI+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vTXVsdGlJbnB1dFBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2luZ2xlRmlsdGVySGVscGVyIiBlU3VwZXJUeXBlcz0iIy8vRmlsdGVySGVscGVyIj4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dFBvcnQiIGxvd2VyQm91bmQ9IjEiDQorICAgICAgICBlVHlwZT0iIy8vU2luZ2xlT3V0cHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNdWx0aUZpbHRlckhlbHBlciIgZVN1cGVyVHlwZXM9IiMvL0ZpbHRlckhlbHBlciI+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXRQb3J0IiBsb3dlckJvdW5kPSIxIg0KKyAgICAgICAgZVR5cGU9IiMvL011bHRpT3V0cHV0UG9ydCIgY29udGFpbm1lbnQ9InRydWUiLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCAjLy9EZXNjcmliZWRFbGVtZW50Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZvbyIgdmFsdWU9ImJhciIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwiIHZhbHVlPSJuYW1lLHR5cGUiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLmljb24iIHZhbHVlPSJmYWxzZSIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ibGFiZWwucGxhY2VtZW50IiB2YWx1ZT0iZXh0ZXJuYWwiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImxhYmVsLnBhdHRlcm4iIHZhbHVlPSJ7MH06ezF9Ii8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0VHlwZSI+DQorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5ld1R5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VKYXZhQ2xhc3MiLz4NCisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW5pdGlhdG9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KKyAgICA8L2VPcGVyYXRpb25zPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idXBkYXRlUG9ydE5hbWUiPg0KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJzaW5ndWxhclBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICAgIDwvZU9wZXJhdGlvbnM+DQorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTaW5ndWxhclBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSmF2YUNsYXNzIi8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2luZ2xlUG9ydCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qb3J0Ij4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSmF2YU9iamVjdCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik11bHRpUG9ydCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qb3J0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImJvcmRlci5jb2xvciIgdmFsdWU9IjI1NSwwLDAiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9ImJvcmRlci53aWR0aCIgdmFsdWU9IjEwIi8+DQorICAgIDwvZUFubm90YXRpb25zPg0KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVwcGVyQm91bmQ9Ii0xIg0KKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUphdmFPYmplY3QiLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbnB1dFBvcnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUG9ydCI+DQorICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJnbWYubm9kZSI+DQorICAgICAgPGRldGFpbHMga2V5PSJmaWd1cmUiIHZhbHVlPSJyZWN0YW5nbGUiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9InNpemUiIHZhbHVlPSIyMCwyMCIvPg0KKyAgICA8L2VBbm5vdGF0aW9ucz4NCisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzTWFwcGluZ1RhcmdldCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4NCisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzUm9vdFBvcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0Ii8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0cHV0UG9ydCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qb3J0Ij4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5ub2RlIj4NCisgICAgICA8ZGV0YWlscyBrZXk9ImZpZ3VyZSIgdmFsdWU9ImVsbGlwc2UiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9InNpemUiIHZhbHVlPSIyMCwyMCIvPg0KKyAgICA8L2VBbm5vdGF0aW9ucz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW5nbGVJbnB1dFBvcnQiIGVTdXBlclR5cGVzPSIjLy9TaW5nbGVQb3J0ICMvL0lucHV0UG9ydCIvPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNdWx0aUlucHV0UG9ydCIgZVN1cGVyVHlwZXM9IiMvL011bHRpUG9ydCAjLy9JbnB1dFBvcnQiLz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2luZ2xlT3V0cHV0UG9ydCIgZVN1cGVyVHlwZXM9IiMvL1NpbmdsZVBvcnQgIy8vT3V0cHV0UG9ydCIvPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNdWx0aU91dHB1dFBvcnQiIGVTdXBlclR5cGVzPSIjLy9NdWx0aVBvcnQgIy8vT3V0cHV0UG9ydCIvPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0TWFwcGluZyIgYWJzdHJhY3Q9InRydWUiPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U291cmNlIiBlVHlwZT0iIy8vUG9ydCIvPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0VGFyZ2V0IiBlVHlwZT0iIy8vSW5wdXRQb3J0Ii8+DQorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJ1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyI+DQorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VKYXZhQ2xhc3MiLz4NCisgICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ic2luZ3VsYXJQb3J0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KKyAgICA8L2VPcGVyYXRpb25zPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idXBkYXRlTWFwcGluZ051bWJlciIvPg0KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idXBkYXRlVmlzdWFsaXphdGlvbiIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNpbmdsZVBvcnRNYXBwaW5nIiBlU3VwZXJUeXBlcz0iIy8vUG9ydE1hcHBpbmciPg0KKyAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmxpbmsiPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ic291cmNlIiB2YWx1ZT0ic291cmNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJ0YXJnZXQiIHZhbHVlPSJ0YXJnZXQiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9InN0eWxlIiB2YWx1ZT0iZG90Ii8+DQorICAgICAgPGRldGFpbHMga2V5PSJ3aWR0aCIgdmFsdWU9IjIiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9InRhcmdldC5kZWNvcmF0aW9uIiB2YWx1ZT0iYXJyb3ciLz4NCisgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9TaW5nbGVQb3J0Ii8+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGVUeXBlPSIjLy9TaW5nbGVJbnB1dFBvcnQiLz4NCisgIDwvZUNsYXNzaWZpZXJzPg0KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNdWx0aVBvcnRNYXBwaW5nIiBlU3VwZXJUeXBlcz0iIy8vUG9ydE1hcHBpbmciPg0KKyAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iZ21mLmxpbmsiPg0KKyAgICAgIDxkZXRhaWxzIGtleT0ic291cmNlIiB2YWx1ZT0ic291cmNlIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJ0YXJnZXQiIHZhbHVlPSJ0YXJnZXQiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9InN0eWxlIiB2YWx1ZT0iZG90Ii8+DQorICAgICAgPGRldGFpbHMga2V5PSJ3aWR0aCIgdmFsdWU9IjIiLz4NCisgICAgICA8ZGV0YWlscyBrZXk9InRhcmdldC5kZWNvcmF0aW9uIiB2YWx1ZT0iYXJyb3ciLz4NCisgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9NdWx0aVBvcnQiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgZVR5cGU9IiMvL011bHRpSW5wdXRQb3J0Ii8+DQorICA8L2VDbGFzc2lmaWVycz4NCisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZyIgZVN1cGVyVHlwZXM9IiMvL1BvcnRNYXBwaW5nIj4NCisgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9ImdtZi5saW5rIj4NCisgICAgICA8ZGV0YWlscyBrZXk9InNvdXJjZSIgdmFsdWU9InNvdXJjZSIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0idGFyZ2V0IiB2YWx1ZT0idGFyZ2V0Ii8+DQorICAgICAgPGRldGFpbHMga2V5PSJzdHlsZSIgdmFsdWU9ImRvdCIvPg0KKyAgICAgIDxkZXRhaWxzIGtleT0id2lkdGgiIHZhbHVlPSIyIi8+DQorICAgICAgPGRldGFpbHMga2V5PSJ0YXJnZXQuZGVjb3JhdGlvbiIgdmFsdWU9ImFycm93Ii8+DQorICAgICAgPGRldGFpbHMga2V5PSJ0b29sLnNtYWxsLmJ1bmRsZSIgdmFsdWU9Im5hbWUiLz4NCisgICAgPC9lQW5ub3RhdGlvbnM+DQorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9NdWx0aVBvcnQiLz4NCisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgZVR5cGU9IiMvL1NpbmdsZUlucHV0UG9ydCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iTWFwcGluZ1Zpc3VhbGl6YXRpb24iPg0KKyAgICA8ZUxpdGVyYWxzIG5hbWU9ImFycm93cyIvPg0KKyAgICA8ZUxpdGVyYWxzIG5hbWU9ImNvbG9yZWRQb3J0cyIgdmFsdWU9IjEiLz4NCisgICAgPGVMaXRlcmFscyBuYW1lPSJpbmRpY2VzIiB2YWx1ZT0iMiIvPg0KKyAgICA8ZUxpdGVyYWxzIG5hbWU9ImFycm93c0FuZENvbG9yZWRQb3J0cyIgdmFsdWU9IjMiLz4NCisgICAgPGVMaXRlcmFscyBuYW1lPSJhcnJvd3NBbmRJbmRpY2VzIiB2YWx1ZT0iNCIvPg0KKyAgPC9lQ2xhc3NpZmllcnM+DQorPC9lY29yZTpFUGFja2FnZT4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5lbWYgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5lbWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1YzU0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvbW9kZWwvY29tcmVsLmVtZgpAQCAtMCwwICsxLDMwMCBAQAorQG5hbWVzcGFjZSh1cmk9Imh0dHA6Ly9jb21yZWwvMC4xIiwgcHJlZml4PSJjb21yZWwiKQorQGdtZihmb289ImJhciIpCitwYWNrYWdlIGNvbXJlbDsKKworQGdtZi5kaWFncmFtKGZvbz0iYmFyIiwgb25lZmlsZT0iZmFsc2UiKQorY2xhc3MgQ29tcG9zaXRlUmVmYWN0b3JpbmcgZXh0ZW5kcyBNb2RlbFJlZmFjdG9yaW5neworICAgIHZhbCBSZWZhY3RvcmluZ1VuaXRbMV0gbWFpblJlZmFjdG9yaW5nVW5pdDsKKyAgICB2YWwgUG9ydE1hcHBpbmdbKl0gcG9ydE1hcHBpbmdzOworICAgIHZhbCBNb2RlbFJlZmFjdG9yaW5nWypdIG1vZGVsUmVmYWN0b3JpbmdzOworICAgIHZhbCBIZWxwZXJbKl0gaGVscGVyOworICAgIGF0dHIgTWFwcGluZ1Zpc3VhbGl6YXRpb25bMV0gbWFwcGluZ1Zpc3VhbGl6YXRpb24gPSAwOworICAgIGF0dHIgU3RyaW5nIGN1c3RvbUluaXRpYWxDb25kaXRpb247CisgICAgYXR0ciBTdHJpbmcgY3VzdG9tRmluYWxDb25kaXRpb247Cit9CisKK2Fic3RyYWN0IGludGVyZmFjZSBOYW1lZEVsZW1lbnQgeworICAgIGF0dHIgU3RyaW5nIG5hbWU7Cit9CisKK2Fic3RyYWN0IGludGVyZmFjZSBEZXNjcmliZWRFbGVtZW50IHsNCisgICBhdHRyIFN0cmluZyBkZXNjcmlwdGlvbjsNCit9CisKK2Fic3RyYWN0IGNsYXNzIFJlZmFjdG9yaW5nVW5pdCBleHRlbmRzIE5hbWVkRWxlbWVudCB7DQorICAgb3AgSW5wdXRQb3J0WypdIGdldEFsbElucHV0UG9ydHMoKTsKKyAgIGF0dHIgaW50IHNlcUV4ZWN1dGlvbk9yZGVyOworICAgb3Agdm9pZCBzZXRTZXFFeGVjdXRpb25PcmRlcihpbnQgc2VxRXhlY3V0aW9uT3JkZXIsIGJvb2xlYW4gc3VwZXJDYWxsKTsKKyAgIG9wIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiB1cGRhdGVDb250YWluZXIpOw0KK30KKworY2xhc3MgTW9kZWxSZWZhY3RvcmluZyBleHRlbmRzIE5hbWVkRWxlbWVudCwgRGVzY3JpYmVkRWxlbWVudHsKKwlhdHRyIFN0cmluZ1sxXSByZWZJZDsKKwlhdHRyIFN0cmluZ1sxXSBsYWJlbDsKKwlhdHRyIFN0cmluZ1sxXSBuYW1lc3BhY2VVcmk7CisgCXZhbCBTaW5nbGVJbnB1dFBvcnRbKl0gaW5wdXRQb3J0czsNCit9CisKK0BnbWYubm9kZShmb289ImJhciIsbGFiZWwuaWNvbj0iZmFsc2UiLGxhYmVsPSJsYWJlbCx0eXBlIixsYWJlbC5wYXR0ZXJuPSJ7MH06ezF9IikKK2NsYXNzIEF0b21pY1VuaXQgZXh0ZW5kcyBSZWZhY3RvcmluZ1VuaXQgeworCUBnbWYuYWZmaXhlZChmb289ImJhciIpCisJdmFsIFNpbmdsZUlucHV0UG9ydFsrXSBpbnB1dFBvcnRzOworCWF0dHIgU3RyaW5nWzFdIHVuaXRJZDsKKwlhdHRyIFN0cmluZ1sxXSBsYWJlbDsKKwlhdHRyIFN0cmluZ1sxXSBuYW1lc3BhY2VVcmk7CisJcmVhZG9ubHkgYXR0ciBTdHJpbmcgdHlwZSA9ICJBdG9taWMgVW5pdCI7CisJcmVmIE1vZGVsUmVmYWN0b3JpbmdbMV0gbW9kZWxSZWZhY3RvcmluZzsKKwlhdHRyIGJvb2xlYW4gY2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZyA9IGZhbHNlOworCWF0dHIgYm9vbGVhbiBjaGVja0ZpbmFsQ29uZGl0aW9uRmxhZyA9IGZhbHNlOworfQorCithYnN0cmFjdCBjbGFzcyBDb21wb3NpdGVVbml0IGV4dGVuZHMgUmVmYWN0b3JpbmdVbml0IHsNCit9CisKK0BnbWYubm9kZShmb289ImJhciIsbGFiZWwuaWNvbj0iZmFsc2UiLGxhYmVsPSJuYW1lLHR5cGUsbGJsU3RyaWN0IixsYWJlbC5wYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIikKK2NsYXNzIFNlcXVlbnRpYWxVbml0IGV4dGVuZHMgQ29tcG9zaXRlVW5pdCB7CisJQGdtZi5jb21wYXJ0bWVudChmb289ImJhciIpCisJdmFsIEhlbHBlclVuaXRbKl0gaGVscGVyVW5pdHM7DQorICAJQGdtZi5jb21wYXJ0bWVudChmb289ImJhciIpCisgICAJdmFsIFJlZmFjdG9yaW5nVW5pdFsrXSByZWZhY3RvcmluZ1VuaXRzOworICAgCUBnbWYuYWZmaXhlZChmb289ImJhciIpCisJdmFsIElucHV0UG9ydFsrXSBpbnB1dFBvcnRzOworCWF0dHIgYm9vbGVhbiBzdHJpY3QgPSB0cnVlOworCXJlYWRvbmx5IGF0dHIgU3RyaW5nIHR5cGUgPSAiU2VxdWVudGlhbCBVbml0IjsKKwlhdHRyIFN0cmluZyBsYmxTdHJpY3QgPSAic3RyaWN0IjsKKwlvcCB2b2lkIHVwZGF0ZVNlcUV4ZWN1dGlvbk9yZGVyKCk7DQorfQorCitAZ21mLm5vZGUoZm9vPSJiYXIiLGxhYmVsLmljb249ImZhbHNlIixsYWJlbD0ibmFtZSx0eXBlLHNwZWMiLGxhYmVsLnBhdHRlcm49InswfTp7MX0gLXsyfS0iKQorY2xhc3MgQ29uZGl0aW9uQ2hlY2sgZXh0ZW5kcyBOYW1lZEVsZW1lbnQsIERlc2NyaWJlZEVsZW1lbnQgeyAKKwlyZWFkb25seSBhdHRyIFN0cmluZyB0eXBlID0gIkNvbmRpdGlvbiBDaGVjayI7DQorCWF0dHIgU3RyaW5nIHNwZWM7Cit9CisKK0BnbWYubm9kZShmb289ImJhciIsbGFiZWwuaWNvbj0iZmFsc2UiLGxhYmVsPSJuYW1lLHR5cGUiLGxhYmVsLnBhdHRlcm49InswfTp7MX0iKQorY2xhc3MgQ29uZGl0aW9uYWxVbml0IGV4dGVuZHMgQ29tcG9zaXRlVW5pdCB7CisJQGdtZi5jb21wYXJ0bWVudChmb289ImJhciIpCisJdmFsIENvbmRpdGlvbkNoZWNrWzFdIGlmOworCUBnbWYuY29tcGFydG1lbnQoZm9vPSJiYXIiKQorCXZhbCBIZWxwZXJVbml0WypdIGhlbHBlclVuaXRzOworCUBnbWYuY29tcGFydG1lbnQoZm9vPSJiYXIiKQorCXZhbCBSZWZhY3RvcmluZ1VuaXRbMV0gdGhlbjsKKwlAZ21mLmNvbXBhcnRtZW50KGZvbz0iYmFyIikKKwl2YWwgUmVmYWN0b3JpbmdVbml0IGVsc2U7CisJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKwl2YWwgSW5wdXRQb3J0WytdIGlucHV0UG9ydHM7CisJcmVhZG9ubHkgYXR0ciBTdHJpbmcgdHlwZSA9ICJDb25kaXRpb25hbCBVbml0IjsNCit9CisKK2Fic3RyYWN0IGNsYXNzIFF1ZXVlZFVuaXQgZXh0ZW5kcyBDb21wb3NpdGVVbml0IHsNCisJb3Agdm9pZCBpbml0KCk7CisJYXR0ciBib29sZWFuIHN0cmljdCA9IHRydWU7Cit9CisKK0BnbWYubm9kZShmb289ImJhciIsbGFiZWwuaWNvbj0iZmFsc2UiLGxhYmVsPSJuYW1lLHR5cGUsbGJsU3RyaWN0IixsYWJlbC5wYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIikKK2NsYXNzIFNpbmdsZVF1ZXVlZFVuaXQgZXh0ZW5kcyBRdWV1ZWRVbml0IHsKKwlAZ21mLmNvbXBhcnRtZW50KGZvbz0iYmFyIikKKwl2YWwgSGVscGVyVW5pdFsqXSBoZWxwZXJVbml0czsKKwlAZ21mLmNvbXBhcnRtZW50KGZvbz0iYmFyIikKKyAgIAl2YWwgUmVmYWN0b3JpbmdVbml0WzFdIHJlZmFjdG9yaW5nVW5pdDsKKyAgIAlAZ21mLmFmZml4ZWQoZm9vPSJiYXIiKQorCXZhbCBTaW5nbGVJbnB1dFBvcnRbKl0gc2luZ2xlSW5wdXRQb3J0czsNCisgICAJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKyAgIAl2YWwgTXVsdGlJbnB1dFBvcnRbMV0gbXVsdGlJbnB1dFBvcnQ7CisJcmVhZG9ubHkgYXR0ciBTdHJpbmcgdHlwZSA9ICJTaW5nbGUgUXVldWVkIFVuaXQiOworCWF0dHIgU3RyaW5nIGxibFN0cmljdCA9ICJzdHJpY3QiOw0KK30KKworYWJzdHJhY3QgY2xhc3MgVHdpY2VkUXVldWVkVW5pdCBleHRlbmRzIFF1ZXVlZFVuaXQgeworfQorCitAZ21mLm5vZGUoZm9vPSJiYXIiLGxhYmVsLmljb249ImZhbHNlIixsYWJlbD0ibmFtZSx0eXBlLGxibFN0cmljdCIsbGFiZWwucGF0dGVybj0iezB9OnsxfSAtezJ9LSIpCitjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0IGV4dGVuZHMgVHdpY2VkUXVldWVkVW5pdCB7CisJQGdtZi5jb21wYXJ0bWVudChmb289ImJhciIpCisJdmFsIEhlbHBlclVuaXRbKl0gaGVscGVyVW5pdHM7CisJQGdtZi5jb21wYXJ0bWVudChmb289ImJhciIpCisgICAJdmFsIFJlZmFjdG9yaW5nVW5pdFsxXSByZWZhY3RvcmluZ1VuaXQ7CisgICAJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKwl2YWwgU2luZ2xlSW5wdXRQb3J0WypdIHNpbmdsZUlucHV0UG9ydHM7CisJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKyAgIAl1bmlxdWUgdmFsIE11bHRpSW5wdXRQb3J0WzJdIG11bHRpSW5wdXRQb3J0czsKKwlyZWFkb25seSBhdHRyIFN0cmluZyB0eXBlID0gIkNhcnRlc2lhbiBRdWV1ZWQgVW5pdCI7CisJYXR0ciBTdHJpbmcgbGJsU3RyaWN0ID0gInN0cmljdCI7DQorfQorCitAZ21mLm5vZGUoZm9vPSJiYXIiLGxhYmVsLmljb249ImZhbHNlIixsYWJlbD0ibmFtZSx0eXBlLGxibFN0cmljdCIsbGFiZWwucGF0dGVybj0iezB9OnsxfSAtezJ9LSIpCitjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXQgZXh0ZW5kcyBUd2ljZWRRdWV1ZWRVbml0IHsKKwlAZ21mLmNvbXBhcnRtZW50KGZvbz0iYmFyIikKKwl2YWwgSGVscGVyVW5pdFsqXSBoZWxwZXJVbml0czsKKwlAZ21mLmNvbXBhcnRtZW50KGZvbz0iYmFyIikKKyAgIAl2YWwgUmVmYWN0b3JpbmdVbml0WzFdIHJlZmFjdG9yaW5nVW5pdHM7CisgICAJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKwl2YWwgU2luZ2xlSW5wdXRQb3J0WypdIHNpbmdsZUlucHV0UG9ydHM7CisJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKyAgIAl1bmlxdWUgdmFsIE11bHRpSW5wdXRQb3J0WzJdIG11bHRpSW5wdXRQb3J0czsKKwlyZWFkb25seSBhdHRyIFN0cmluZyB0eXBlID0gIlBhcmFsbGVsIFF1ZXVlZCBVbml0IjsKKwlhdHRyIFN0cmluZyBsYmxTdHJpY3QgPSAic3RyaWN0IjsKK30KKworYWJzdHJhY3QgY2xhc3MgSGVscGVyVW5pdCBleHRlbmRzIE5hbWVkRWxlbWVudCwgRGVzY3JpYmVkRWxlbWVudCB7CisJYXR0ciBTdHJpbmdbMV0gaGVscGVyVW5pdElkOworCWF0dHIgU3RyaW5nWzFdIG5hbWVzcGFjZVVyaTsKKwlvcCBJbnB1dFBvcnRbMV0gZ2V0SW5wdXRQb3J0KCk7CisJb3AgT3V0cHV0UG9ydFsxXSBnZXRPdXRwdXRQb3J0KCk7DQorfQorCithYnN0cmFjdCBjbGFzcyBGZWF0dXJlVW5pdCBleHRlbmRzIEhlbHBlclVuaXQgew0KK30KKworQGdtZi5ub2RlKGZvbz0iYmFyIixsYWJlbC5pY29uPSJmYWxzZSIsbGFiZWw9Im5hbWUsdHlwZSIsbGFiZWwucGF0dGVybj0iezB9OnsxfSIpCitjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdCBleHRlbmRzIEZlYXR1cmVVbml0IHsKKwlAZ21mLmFmZml4ZWQoZm9vPSJiYXIiKQorCXZhbCBTaW5nbGVJbnB1dFBvcnRbMV0gaW5wdXRQb3J0OworCUBnbWYuYWZmaXhlZChmb289ImJhciIpCisJdmFsIE11bHRpSW5wdXRQb3J0WypdIHNlY29uZGFyeUlucHV0UG9ydHM7CisgICAJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKwl2YWwgU2luZ2xlT3V0cHV0UG9ydFsxXSBvdXRwdXRQb3J0OworCXJlZiBTaW5nbGVGZWF0dXJlSGVscGVyWzFdIHNpbmdsZUZlYXR1cmVIZWxwZXI7CisJcmVhZG9ubHkgYXR0ciBTdHJpbmcgdHlwZSA9ICJTaW5nbGUgRmVhdHVyZSBVbml0IjsNCit9CisKK0BnbWYubm9kZShmb289ImJhciIsbGFiZWwuaWNvbj0iZmFsc2UiLGxhYmVsPSJuYW1lLHR5cGUiLGxhYmVsLnBhdHRlcm49InswfTp7MX0iKQorY2xhc3MgTXVsdGlGZWF0dXJlVW5pdCBleHRlbmRzIEZlYXR1cmVVbml0IHsKKwlAZ21mLmFmZml4ZWQoZm9vPSJiYXIiKQorCXZhbCBTaW5nbGVJbnB1dFBvcnRbMV0gaW5wdXRQb3J0OworCUBnbWYuYWZmaXhlZChmb289ImJhciIpCisJdmFsIE11bHRpSW5wdXRQb3J0WypdIHNlY29uZGFyeUlucHV0UG9ydHM7CisgICAJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKwl2YWwgTXVsdGlPdXRwdXRQb3J0WzFdIG91dHB1dFBvcnQ7CisJcmVmIE11bHRpRmVhdHVyZUhlbHBlclsxXSBtdWx0aUZlYXR1cmVIZWxwZXI7CisJcmVhZG9ubHkgYXR0ciBTdHJpbmcgdHlwZSA9ICJNdWx0aSBGZWF0dXJlIFVuaXQiOw0KK30KKworYWJzdHJhY3QgY2xhc3MgRmlsdGVyVW5pdCBleHRlbmRzIEhlbHBlclVuaXQgew0KK30KKworQGdtZi5ub2RlKGZvbz0iYmFyIixsYWJlbC5pY29uPSJmYWxzZSIsbGFiZWw9Im5hbWUsdHlwZSIsbGFiZWwucGF0dGVybj0iezB9OnsxfSIpCitjbGFzcyBTaW5nbGVGaWx0ZXJVbml0IGV4dGVuZHMgRmlsdGVyVW5pdHsKKwlAZ21mLmFmZml4ZWQoZm9vPSJiYXIiKQorCXZhbCBNdWx0aUlucHV0UG9ydFsxXSBpbnB1dFBvcnQ7DQorICAgIEBnbWYuYWZmaXhlZChmb289ImJhciIpCisJdmFsIFNpbmdsZU91dHB1dFBvcnRbMV0gb3V0cHV0UG9ydDsKKwlyZWYgU2luZ2xlRmlsdGVySGVscGVyWzFdIHNpbmdsZUZpbHRlckhlbHBlcjsKKwlyZWFkb25seSBhdHRyIFN0cmluZyB0eXBlID0gIlNpbmdsZSBGaWx0ZXIgVW5pdCI7DQorfQorCitAZ21mLm5vZGUoZm9vPSJiYXIiLGxhYmVsLmljb249ImZhbHNlIixsYWJlbD0ibmFtZSx0eXBlIixsYWJlbC5wYXR0ZXJuPSJ7MH06ezF9IikKK2NsYXNzIE11bHRpRmlsdGVyVW5pdCBleHRlbmRzIEZpbHRlclVuaXR7CisJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKwl2YWwgTXVsdGlJbnB1dFBvcnRbMV0gaW5wdXRQb3J0OworICAJQGdtZi5hZmZpeGVkKGZvbz0iYmFyIikKKwl2YWwgTXVsdGlPdXRwdXRQb3J0WzFdIG91dHB1dFBvcnQ7CisJcmVmIE11bHRpRmlsdGVySGVscGVyWzFdIG11bHRpRmlsdGVySGVscGVyOworCXJlYWRvbmx5IGF0dHIgU3RyaW5nIHR5cGUgPSAiTXVsdGkgRmlsdGVyIFVuaXQiOw0KK30KKworYWJzdHJhY3QgY2xhc3MgSGVscGVyIGV4dGVuZHMgTmFtZWRFbGVtZW50LCBEZXNjcmliZWRFbGVtZW50eworCWF0dHIgU3RyaW5nWzFdIGhlbHBlcklkOworCWF0dHIgU3RyaW5nWzFdIG5hbWVzcGFjZVVyaTsNCit9CisKK2Fic3RyYWN0IGNsYXNzIEZlYXR1cmVIZWxwZXIgZXh0ZW5kcyBIZWxwZXJ7ICAKKwl2YWwgU2luZ2xlSW5wdXRQb3J0WzFdIGlucHV0UG9ydDsKKwl2YWwgTXVsdGlJbnB1dFBvcnRbKl0gc2Vjb25kYXJ5SW5wdXRQb3J0czsNCit9CisKK2NsYXNzIFNpbmdsZUZlYXR1cmVIZWxwZXIgZXh0ZW5kcyBGZWF0dXJlSGVscGVyeyAKKwl2YWwgU2luZ2xlT3V0cHV0UG9ydFsxXSBvdXRwdXRQb3J0OyANCit9CisKK2NsYXNzIE11bHRpRmVhdHVyZUhlbHBlciBleHRlbmRzIEZlYXR1cmVIZWxwZXJ7CisJdmFsIE11bHRpT3V0cHV0UG9ydFsxXSBvdXRwdXRQb3J0Ow0KK30KKworYWJzdHJhY3QgY2xhc3MgRmlsdGVySGVscGVyIGV4dGVuZHMgSGVscGVyeworCXZhbCBNdWx0aUlucHV0UG9ydFsxXSBpbnB1dFBvcnQ7CisJDQorfQorCitjbGFzcyBTaW5nbGVGaWx0ZXJIZWxwZXIgZXh0ZW5kcyBGaWx0ZXJIZWxwZXJ7DQorICAgdmFsIFNpbmdsZU91dHB1dFBvcnRbMV0gb3V0cHV0UG9ydDsNCit9CisKK2NsYXNzIE11bHRpRmlsdGVySGVscGVyIGV4dGVuZHMgRmlsdGVySGVscGVyew0KKyAgIHZhbCBNdWx0aU91dHB1dFBvcnRbMV0gb3V0cHV0UG9ydDsNCit9CisKK0BnbWYubm9kZShmb289ImJhciIsbGFiZWw9Im5hbWUsdHlwZSIsbGFiZWwuaWNvbj0iZmFsc2UiLGxhYmVsLnBsYWNlbWVudD0iZXh0ZXJuYWwiLGxhYmVsLnBhdHRlcm49InswfTp7MX0iKQorYWJzdHJhY3QgY2xhc3MgUG9ydCBleHRlbmRzIE5hbWVkRWxlbWVudCwgRGVzY3JpYmVkRWxlbWVudCB7CisJYXR0ciBDbGFzc1sxXSB0eXBlOworCW9wIHZvaWQgc2V0VHlwZShDbGFzcyBuZXdUeXBlLCBib29sZWFuIGluaXRpYXRvcik7CisJb3Agdm9pZCB1cGRhdGVQb3J0TmFtZShTdHJpbmcgc2luZ3VsYXJQb3J0TmFtZSk7CisJb3AgU3RyaW5nIGdldFNpbmd1bGFyUG9ydE5hbWUoKTsKK30KKworCithYnN0cmFjdCBjbGFzcyBTaW5nbGVQb3J0IGV4dGVuZHMgUG9ydHsKKwlhdHRyIE9iamVjdCB2YWx1ZTsNCit9CisKK0BnbWYubm9kZShib3JkZXIuY29sb3I9IjI1NSwwLDAiLGJvcmRlci53aWR0aD0iMTAiKQorYWJzdHJhY3QgY2xhc3MgTXVsdGlQb3J0IGV4dGVuZHMgUG9ydHsKKwlhdHRyIE9iamVjdFsqXSB2YWx1ZTsNCit9CisKK0BnbWYubm9kZShmaWd1cmU9InJlY3RhbmdsZSIsIHNpemU9IjIwLDIwIikKK2Fic3RyYWN0IGNsYXNzIElucHV0UG9ydCBleHRlbmRzIFBvcnR7ICAKKwlvcCBCb29sZWFuIGlzTWFwcGluZ1RhcmdldCgpOworCW9wIEJvb2xlYW4gaXNSb290UG9ydCgpOw0KK30KKworQGdtZi5ub2RlKGZpZ3VyZT0iZWxsaXBzZSIsc2l6ZT0iMjAsMjAiKQorYWJzdHJhY3QgY2xhc3MgT3V0cHV0UG9ydCBleHRlbmRzIFBvcnR7DQorfQorCitjbGFzcyBTaW5nbGVJbnB1dFBvcnQgZXh0ZW5kcyBTaW5nbGVQb3J0LCBJbnB1dFBvcnR7DQorfQorCitjbGFzcyBNdWx0aUlucHV0UG9ydCBleHRlbmRzIE11bHRpUG9ydCwgSW5wdXRQb3J0eworfQorCitjbGFzcyBTaW5nbGVPdXRwdXRQb3J0IGV4dGVuZHMgU2luZ2xlUG9ydCwgT3V0cHV0UG9ydHsKK30KKworY2xhc3MgTXVsdGlPdXRwdXRQb3J0IGV4dGVuZHMgTXVsdGlQb3J0LCBPdXRwdXRQb3J0eworfQorCithYnN0cmFjdCBjbGFzcyBQb3J0TWFwcGluZyB7CisJb3AgUG9ydCBnZXRTb3VyY2UoKTsKKwlvcCBJbnB1dFBvcnQgZ2V0VGFyZ2V0KCk7CisJb3Agdm9pZCB1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyhDbGFzcyB0eXBlLCBTdHJpbmcgc2luZ3VsYXJQb3J0TmFtZSk7CisJb3Agdm9pZCB1cGRhdGVNYXBwaW5nTnVtYmVyKCk7CisJb3Agdm9pZCB1cGRhdGVWaXN1YWxpemF0aW9uKCk7DQorfQorCitAZ21mLmxpbmsoc291cmNlPSJzb3VyY2UiLCB0YXJnZXQ9InRhcmdldCIsIHN0eWxlPSJkb3QiLCB3aWR0aD0iMiIsdGFyZ2V0LmRlY29yYXRpb249ImFycm93IikKK2NsYXNzIFNpbmdsZVBvcnRNYXBwaW5nIGV4dGVuZHMgUG9ydE1hcHBpbmcgew0KKyAgIHJlZiBTaW5nbGVQb3J0IHNvdXJjZTsKKyAgIHJlZiBTaW5nbGVJbnB1dFBvcnQgdGFyZ2V0Ow0KK30KKworQGdtZi5saW5rKHNvdXJjZT0ic291cmNlIiwgdGFyZ2V0PSJ0YXJnZXQiLCBzdHlsZT0iZG90Iiwgd2lkdGg9IjIiLCB0YXJnZXQuZGVjb3JhdGlvbj0iYXJyb3ciKQorY2xhc3MgTXVsdGlQb3J0TWFwcGluZyBleHRlbmRzIFBvcnRNYXBwaW5nIHsKKyAgIHJlZiBNdWx0aVBvcnQgc291cmNlOworICAgcmVmIE11bHRpSW5wdXRQb3J0IHRhcmdldDsKKyAgIAorfQorCitAZ21mLmxpbmsoc291cmNlPSJzb3VyY2UiLCB0YXJnZXQ9InRhcmdldCIsIHN0eWxlPSJkb3QiLCB3aWR0aD0iMiIsdGFyZ2V0LmRlY29yYXRpb249ImFycm93Iix0b29sLnNtYWxsLmJ1bmRsZT0ibmFtZSIpCitjbGFzcyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIGV4dGVuZHMgUG9ydE1hcHBpbmcgeworICAgcmVmIE11bHRpUG9ydCBzb3VyY2U7CisgICByZWYgU2luZ2xlSW5wdXRQb3J0IHRhcmdldDsKK30KKworZW51bSBNYXBwaW5nVmlzdWFsaXphdGlvbiB7DQorICAgYXJyb3dzID0gMDsKKyAgIGNvbG9yZWRQb3J0cyA9IDE7CisgICBpbmRpY2VzID0gMjsKKyAgIGFycm93c0FuZENvbG9yZWRQb3J0cyA9IDM7ICAKKyAgIGFycm93c0FuZEluZGljZXMgPSA0Ow0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5nZW5tb2RlbCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvbW9kZWwvY29tcmVsLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTJkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5nZW5tb2RlbApAQCAtMCwwICsxLDIxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCINCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSINCisgICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvY29tcmVsL3NyYyINCisgICAgbW9kZWxQbHVnaW5JRD0iY29tcmVsIiBtb2RlbE5hbWU9IkNvbXJlbCIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmVjb3JlIg0KKyAgICBjb21wbGlhbmNlTGV2ZWw9IjYuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSI+DQorICA8Zm9yZWlnbk1vZGVsPmNvbXJlbC5lY29yZTwvZm9yZWlnbk1vZGVsPg0KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iQ29tcmVsIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBlY29yZVBhY2thZ2U9ImNvbXJlbC5lY29yZSMvIj4NCisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImNvbXJlbC5lY29yZSMvL01hcHBpbmdWaXN1YWxpemF0aW9uIj4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbXJlbC5lY29yZSMvL01hcHBpbmdWaXN1YWxpemF0aW9uL2Fycm93cyIvPg0KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iY29tcmVsLmVjb3JlIy8vTWFwcGluZ1Zpc3VhbGl6YXRpb24vY29sb3JlZFBvcnRzIi8+DQorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21yZWwuZWNvcmUjLy9NYXBwaW5nVmlzdWFsaXphdGlvbi9pbmRpY2VzIi8+DQorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJjb21yZWwuZWNvcmUjLy9NYXBwaW5nVmlzdWFsaXphdGlvbi9hcnJvd3NBbmRDb2xvcmVkUG9ydHMiLz4NCisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImNvbXJlbC5lY29yZSMvL01hcHBpbmdWaXN1YWxpemF0aW9uL2Fycm93c0FuZEluZGljZXMiLz4NCisgICAgPC9nZW5FbnVtcz4NCisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmciPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvbWFpblJlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvcG9ydE1hcHBpbmdzIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9Db21wb3NpdGVSZWZhY3RvcmluZy9tb2RlbFJlZmFjdG9yaW5ncyIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvaGVscGVyIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21hcHBpbmdWaXN1YWxpemF0aW9uIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL2N1c3RvbUluaXRpYWxDb25kaXRpb24iLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvY3VzdG9tRmluYWxDb25kaXRpb24iLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL05hbWVkRWxlbWVudCI+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9EZXNjcmliZWRFbGVtZW50Ij4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vRGVzY3JpYmVkRWxlbWVudC9kZXNjcmlwdGlvbiIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vUmVmYWN0b3JpbmdVbml0Ij4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vUmVmYWN0b3JpbmdVbml0L3NlcUV4ZWN1dGlvbk9yZGVyIi8+DQorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImNvbXJlbC5lY29yZSMvL1JlZmFjdG9yaW5nVW5pdC9nZXRBbGxJbnB1dFBvcnRzIi8+DQorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImNvbXJlbC5lY29yZSMvL1JlZmFjdG9yaW5nVW5pdC9zZXRTZXFFeGVjdXRpb25PcmRlciI+DQorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iY29tcmVsLmVjb3JlIy8vUmVmYWN0b3JpbmdVbml0L3NldFNlcUV4ZWN1dGlvbk9yZGVyL3NlcUV4ZWN1dGlvbk9yZGVyIi8+DQorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iY29tcmVsLmVjb3JlIy8vUmVmYWN0b3JpbmdVbml0L3NldFNlcUV4ZWN1dGlvbk9yZGVyL3N1cGVyQ2FsbCIvPg0KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tcmVsLmVjb3JlIy8vUmVmYWN0b3JpbmdVbml0L3NldE5hbWUiPg0KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImNvbXJlbC5lY29yZSMvL1JlZmFjdG9yaW5nVW5pdC9zZXROYW1lL25ld05hbWUiLz4NCisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJjb21yZWwuZWNvcmUjLy9SZWZhY3RvcmluZ1VuaXQvc2V0TmFtZS91cGRhdGVDb250YWluZXIiLz4NCisgICAgICA8L2dlbk9wZXJhdGlvbnM+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vTW9kZWxSZWZhY3RvcmluZyI+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL01vZGVsUmVmYWN0b3JpbmcvcmVmSWQiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vTW9kZWxSZWZhY3RvcmluZy9sYWJlbCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9Nb2RlbFJlZmFjdG9yaW5nL25hbWVzcGFjZVVyaSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vTW9kZWxSZWZhY3RvcmluZy9pbnB1dFBvcnRzIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vQXRvbWljVW5pdCI+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9BdG9taWNVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vQXRvbWljVW5pdC91bml0SWQiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vQXRvbWljVW5pdC9sYWJlbCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9BdG9taWNVbml0L25hbWVzcGFjZVVyaSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL0F0b21pY1VuaXQvdHlwZSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9BdG9taWNVbml0L21vZGVsUmVmYWN0b3JpbmciLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vQXRvbWljVW5pdC9jaGVja0luaXRpYWxDb25kaXRpb25GbGFnIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL0F0b21pY1VuaXQvY2hlY2tGaW5hbENvbmRpdGlvbkZsYWciLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL0NvbXBvc2l0ZVVuaXQiLz4NCisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NlcXVlbnRpYWxVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NlcXVlbnRpYWxVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvc3RyaWN0Ii8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvdHlwZSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9TZXF1ZW50aWFsVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvdXBkYXRlU2VxRXhlY3V0aW9uT3JkZXIiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25DaGVjayI+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uQ2hlY2svdHlwZSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9Db25kaXRpb25DaGVjay9zcGVjIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0Ij4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdC9pZiIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvdGhlbiIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdC9pbnB1dFBvcnRzIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L3R5cGUiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1F1ZXVlZFVuaXQiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9RdWV1ZWRVbml0L3N0cmljdCIvPg0KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb21yZWwuZWNvcmUjLy9RdWV1ZWRVbml0L2luaXQiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVRdWV1ZWRVbml0Ij4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9TaW5nbGVRdWV1ZWRVbml0L3NpbmdsZUlucHV0UG9ydHMiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvbXVsdGlJbnB1dFBvcnQiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9TaW5nbGVRdWV1ZWRVbml0L3R5cGUiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1R3aWNlZFF1ZXVlZFVuaXQiLz4NCisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vQ2FydGVzaWFuUXVldWVkVW5pdCI+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vQ2FydGVzaWFuUXVldWVkVW5pdC9zaW5nbGVJbnB1dFBvcnRzIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L211bHRpSW5wdXRQb3J0cyIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL0NhcnRlc2lhblF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdCI+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9QYXJhbGxlbFF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9QYXJhbGxlbFF1ZXVlZFVuaXQvc2luZ2xlSW5wdXRQb3J0cyIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vUGFyYWxsZWxRdWV1ZWRVbml0L211bHRpSW5wdXRQb3J0cyIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC90eXBlIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL0hlbHBlclVuaXQiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9IZWxwZXJVbml0L2hlbHBlclVuaXRJZCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9IZWxwZXJVbml0L25hbWVzcGFjZVVyaSIvPg0KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb21yZWwuZWNvcmUjLy9IZWxwZXJVbml0L2dldElucHV0UG9ydCIvPg0KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb21yZWwuZWNvcmUjLy9IZWxwZXJVbml0L2dldE91dHB1dFBvcnQiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL0ZlYXR1cmVVbml0Ii8+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUZlYXR1cmVVbml0Ij4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NpbmdsZUZlYXR1cmVVbml0L2lucHV0UG9ydCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vU2luZ2xlRmVhdHVyZVVuaXQvc2Vjb25kYXJ5SW5wdXRQb3J0cyIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vU2luZ2xlRmVhdHVyZVVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9TaW5nbGVGZWF0dXJlVW5pdC9zaW5nbGVGZWF0dXJlSGVscGVyIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vU2luZ2xlRmVhdHVyZVVuaXQvdHlwZSIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL011bHRpRmVhdHVyZVVuaXQiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vTXVsdGlGZWF0dXJlVW5pdC9pbnB1dFBvcnQiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL011bHRpRmVhdHVyZVVuaXQvc2Vjb25kYXJ5SW5wdXRQb3J0cyIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vTXVsdGlGZWF0dXJlVW5pdC9vdXRwdXRQb3J0Ii8+DQorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL011bHRpRmVhdHVyZVVuaXQvbXVsdGlGZWF0dXJlSGVscGVyIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vTXVsdGlGZWF0dXJlVW5pdC90eXBlIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9GaWx0ZXJVbml0Ii8+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUZpbHRlclVuaXQiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vU2luZ2xlRmlsdGVyVW5pdC9pbnB1dFBvcnQiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NpbmdsZUZpbHRlclVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9TaW5nbGVGaWx0ZXJVbml0L3NpbmdsZUZpbHRlckhlbHBlciIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL1NpbmdsZUZpbHRlclVuaXQvdHlwZSIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL011bHRpRmlsdGVyVW5pdCI+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9NdWx0aUZpbHRlclVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9NdWx0aUZpbHRlclVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9NdWx0aUZpbHRlclVuaXQvbXVsdGlGaWx0ZXJIZWxwZXIiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9NdWx0aUZpbHRlclVuaXQvdHlwZSIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vSGVscGVyIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vSGVscGVyL2hlbHBlcklkIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbXJlbC5lY29yZSMvL0hlbHBlci9uYW1lc3BhY2VVcmkiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL0ZlYXR1cmVIZWxwZXIiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vRmVhdHVyZUhlbHBlci9pbnB1dFBvcnQiLz4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL0ZlYXR1cmVIZWxwZXIvc2Vjb25kYXJ5SW5wdXRQb3J0cyIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUZlYXR1cmVIZWxwZXIiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vU2luZ2xlRmVhdHVyZUhlbHBlci9vdXRwdXRQb3J0Ii8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vTXVsdGlGZWF0dXJlSGVscGVyIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL011bHRpRmVhdHVyZUhlbHBlci9vdXRwdXRQb3J0Ii8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9GaWx0ZXJIZWxwZXIiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vRmlsdGVySGVscGVyL2lucHV0UG9ydCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUZpbHRlckhlbHBlciI+DQorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9TaW5nbGVGaWx0ZXJIZWxwZXIvb3V0cHV0UG9ydCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL011bHRpRmlsdGVySGVscGVyIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL011bHRpRmlsdGVySGVscGVyL291dHB1dFBvcnQiLz4NCisgICAgPC9nZW5DbGFzc2VzPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1BvcnQiPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb21yZWwuZWNvcmUjLy9Qb3J0L3R5cGUiLz4NCisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tcmVsLmVjb3JlIy8vUG9ydC9zZXRUeXBlIj4NCisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJjb21yZWwuZWNvcmUjLy9Qb3J0L3NldFR5cGUvbmV3VHlwZSIvPg0KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImNvbXJlbC5lY29yZSMvL1BvcnQvc2V0VHlwZS9pbml0aWF0b3IiLz4NCisgICAgICA8L2dlbk9wZXJhdGlvbnM+DQorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImNvbXJlbC5lY29yZSMvL1BvcnQvdXBkYXRlUG9ydE5hbWUiPg0KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImNvbXJlbC5lY29yZSMvL1BvcnQvdXBkYXRlUG9ydE5hbWUvc2luZ3VsYXJQb3J0TmFtZSIvPg0KKyAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tcmVsLmVjb3JlIy8vUG9ydC9nZXRTaW5ndWxhclBvcnROYW1lIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVQb3J0Ij4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vU2luZ2xlUG9ydC92YWx1ZSIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iY29tcmVsLmVjb3JlIy8vTXVsdGlQb3J0Ij4NCisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tcmVsLmVjb3JlIy8vTXVsdGlQb3J0L3ZhbHVlIi8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9JbnB1dFBvcnQiPg0KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb21yZWwuZWNvcmUjLy9JbnB1dFBvcnQvaXNNYXBwaW5nVGFyZ2V0Ii8+DQorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImNvbXJlbC5lY29yZSMvL0lucHV0UG9ydC9pc1Jvb3RQb3J0Ii8+DQorICAgIDwvZ2VuQ2xhc3Nlcz4NCisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9PdXRwdXRQb3J0Ii8+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUlucHV0UG9ydCIvPg0KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9NdWx0aUlucHV0UG9ydCIvPg0KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVPdXRwdXRQb3J0Ii8+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL011bHRpT3V0cHV0UG9ydCIvPg0KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1BvcnRNYXBwaW5nIj4NCisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tcmVsLmVjb3JlIy8vUG9ydE1hcHBpbmcvZ2V0U291cmNlIi8+DQorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImNvbXJlbC5lY29yZSMvL1BvcnRNYXBwaW5nL2dldFRhcmdldCIvPg0KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb21yZWwuZWNvcmUjLy9Qb3J0TWFwcGluZy91cGRhdGVQb3J0VHlwZXNBbmROYW1lcyI+DQorICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iY29tcmVsLmVjb3JlIy8vUG9ydE1hcHBpbmcvdXBkYXRlUG9ydFR5cGVzQW5kTmFtZXMvdHlwZSIvPg0KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImNvbXJlbC5lY29yZSMvL1BvcnRNYXBwaW5nL3VwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzL3Npbmd1bGFyUG9ydE5hbWUiLz4NCisgICAgICA8L2dlbk9wZXJhdGlvbnM+DQorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImNvbXJlbC5lY29yZSMvL1BvcnRNYXBwaW5nL3VwZGF0ZU1hcHBpbmdOdW1iZXIiLz4NCisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iY29tcmVsLmVjb3JlIy8vUG9ydE1hcHBpbmcvdXBkYXRlVmlzdWFsaXphdGlvbiIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL1NpbmdsZVBvcnRNYXBwaW5nIj4NCisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgY29tcmVsLmVjb3JlIy8vU2luZ2xlUG9ydE1hcHBpbmcvc291cmNlIi8+DQorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGNvbXJlbC5lY29yZSMvL1NpbmdsZVBvcnRNYXBwaW5nL3RhcmdldCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL011bHRpUG9ydE1hcHBpbmciPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9NdWx0aVBvcnRNYXBwaW5nL3NvdXJjZSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9NdWx0aVBvcnRNYXBwaW5nL3RhcmdldCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvbXJlbC5lY29yZSMvL011bHRpU2luZ2xlUG9ydE1hcHBpbmciPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nL3NvdXJjZSIvPg0KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBjb21yZWwuZWNvcmUjLy9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nL3RhcmdldCIvPg0KKyAgICA8L2dlbkNsYXNzZXM+DQorICA8L2dlblBhY2thZ2VzPg0KKzwvZ2VubW9kZWw6R2VuTW9kZWw+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwuZ21mZ2VuIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwuZ21mZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDExNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5nbWZnZW4KQEAgLTAsMCArMSw4ODIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSINCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA5L0dlbk1vZGVsIiBjb3B5cmlnaHRUZXh0PSIiPg0KKyAgPGRpYWdyYW0NCisgICAgICB2aXN1YWxJRD0iMTAwMCINCisgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29tcG9zaXRlUmVmYWN0b3JpbmdFZGl0UGFydCINCisgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb21wb3NpdGVSZWZhY3RvcmluZ0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29tcG9zaXRlUmVmYWN0b3JpbmdDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciDQorICAgICAgdmFsaWRhdGlvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyINCisgICAgICB2YWxpZGF0aW9uRW5hYmxlZD0idHJ1ZSINCisgICAgICB2YWxpZGF0aW9uRGVjb3JhdG9ycz0idHJ1ZSINCisgICAgICBsaXZlVmFsaWRhdGlvblVJRmVlZGJhY2s9InRydWUiPg0KKyAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPg0KKyAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSINCisgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkNvbXBvc2l0ZVJlZmFjdG9yaW5nRWRpdEhlbHBlciIvPg0KKyAgICA8dmlld21hcA0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIg0KKyAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPg0KKyAgICA8Y29udGFpbnNTaG9ydGN1dHNUbz5jb21yZWw8L2NvbnRhaW5zU2hvcnRjdXRzVG8+DQorICAgIDxzaG9ydGN1dHNQcm92aWRlZEZvcj5jb21yZWw8L3Nob3J0Y3V0c1Byb3ZpZGVkRm9yPg0KKyAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQNCisgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db21wb3NpdGVSZWZhY3RvcmluZyIvPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DaGlsZFNpZGVBZmZpeGVkTm9kZSINCisgICAgICAgIHZpc3VhbElEPSIzMDAxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQyQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDYiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMC9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVJbnB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpEZWZhdWx0U2l6ZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgd2lkdGg9IjIwIg0KKyAgICAgICAgICAgIGhlaWdodD0iMjAiLz4NCisgICAgICA8L3ZpZXdtYXA+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUlucHV0UG9ydCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9zaW5nbGVJbnB1dFBvcnRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3NpbmdsZUlucHV0UG9ydHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIg0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAwMiINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlMkVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7U2luZ2xlSW5wdXRQb3J0JnF1b3Q7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUG9ydC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ2hpbGRTaWRlQWZmaXhlZE5vZGUiDQorICAgICAgICB2aXN1YWxJRD0iMzAwMiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiDQorICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0RWRpdEhlbHBlciIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMTApOyYjeEE7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihUSElTX0ZPUkUmI3hBOyk7JiN4QTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRISVNfRk9SRSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAwLCAwKTsmI3hBOyYjeEE7Ij4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIi8+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUlucHV0UG9ydCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9tdWx0aUlucHV0UG9ydHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvbXVsdGlJbnB1dFBvcnRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMDMiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtNdWx0aUlucHV0UG9ydCZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzAwMyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjMiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDYXJ0ZXNpYW5RdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNzkiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMDQiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0MkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0MkNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIg0KKyAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7UGFyYWxsZWxRdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA3OCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0MkVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMDUiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0M0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDNDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDNDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMC9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVJbnB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpEZWZhdWx0U2l6ZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgd2lkdGg9IjIwIg0KKyAgICAgICAgICAgIGhlaWdodD0iMjAiLz4NCisgICAgICA8L3ZpZXdtYXA+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUlucHV0UG9ydCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3NpbmdsZUlucHV0UG9ydHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9zaW5nbGVJbnB1dFBvcnRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMDQiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTNFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90O1NpbmdsZUlucHV0UG9ydCZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMDYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDJDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDEwKTsmI3hBOyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFJiN4QTspOyYjeEE7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUSElTX0ZPUkUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMCwgMCk7JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9tdWx0aUlucHV0UG9ydHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9tdWx0aUlucHV0UG9ydHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIg0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAwNSINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGUySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7TXVsdGlJbnB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMDciDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0M0NyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDYXJ0ZXNpYW5RdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNzciDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMDgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy45IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTAiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiDQorICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0RWRpdEhlbHBlciIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlRmVhdHVyZVVuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGZWF0dXJlVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDA5Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZlYXR1cmVVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DaGlsZFNpZGVBZmZpeGVkTm9kZSINCisgICAgICAgIHZpc3VhbElEPSIzMDA5Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM3IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZlYXR1cmVVbml0L2lucHV0UG9ydCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmVhdHVyZVVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMDYiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTRFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90O1NpbmdsZUlucHV0UG9ydCZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMTAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQzRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0M0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDNDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjAiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDEwKTsmI3hBOyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFJiN4QTspOyYjeEE7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUSElTX0ZPUkUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMCwgMCk7JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZlYXR1cmVVbml0L3NlY29uZGFyeUlucHV0UG9ydHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZlYXR1cmVVbml0L3NlY29uZGFyeUlucHV0UG9ydHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIg0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAwNyINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGUzRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7TXVsdGlJbnB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DaGlsZFNpZGVBZmZpeGVkTm9kZSINCisgICAgICAgIHZpc3VhbElEPSIzMDExIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiDQorICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnRFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVPdXRwdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVPdXRwdXRQb3J0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2UgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlT3V0cHV0UG9ydCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmVhdHVyZVVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmVhdHVyZVVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiDQorICAgICAgICAgIHZpc3VhbElEPSI1MDA4Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydE5hbWVUeXBlRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnROYW1lVHlwZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZU91dHB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7U2luZ2xlT3V0cHV0UG9ydCZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzAxMiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEzIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTQiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTAgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE0IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yMCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIg0KKyAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0RWRpdEhlbHBlciIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7TXVsdGlGZWF0dXJlVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAxMyINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXROYW1lVHlwZUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMTMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDVDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZlYXR1cmVVbml0L2lucHV0UG9ydCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiDQorICAgICAgICAgIHZpc3VhbElEPSI1MDEwIg0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU1RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlNUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtTaW5nbGVJbnB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DaGlsZFNpZGVBZmZpeGVkTm9kZSINCisgICAgICAgIHZpc3VhbElEPSIzMDE0Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0NEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUlucHV0UG9ydEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMTApOyYjeEE7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihUSElTX0ZPUkUmI3hBOyk7JiN4QTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRISVNfRk9SRSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAwLCAwKTsmI3hBOyYjeEE7Ij4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIi8+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUlucHV0UG9ydCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlGZWF0dXJlVW5pdC9zZWNvbmRhcnlJbnB1dFBvcnRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZlYXR1cmVVbml0L3NlY29uZGFyeUlucHV0UG9ydHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIg0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAxMSINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGU0RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGU0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7TXVsdGlJbnB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DaGlsZFNpZGVBZmZpeGVkTm9kZSINCisgICAgICAgIHZpc3VhbElEPSIzMDE1Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpT3V0cHV0UG9ydEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlPdXRwdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpT3V0cHV0UG9ydFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlPdXRwdXRQb3J0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9Ik11bHRpT3V0cHV0UG9ydENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjEiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIg0KKyAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnRFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpT3V0cHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpT3V0cHV0UG9ydEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMTApOyYjeEE7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihUSElTX0ZPUkUmI3hBOyk7JiN4QTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRISVNfRk9SRSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAwLCAwKTsmI3hBOyYjeEE7Ij4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIi8+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aU91dHB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlGZWF0dXJlVW5pdC9vdXRwdXRQb3J0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMTIiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnROYW1lVHlwZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpT3V0cHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aU91dHB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtNdWx0aU91dHB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMTYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNyINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiDQorICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXRFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtTaW5nbGVGaWx0ZXJVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDE2Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ2hpbGRTaWRlQWZmaXhlZE5vZGUiDQorICAgICAgICB2aXN1YWxJRD0iMzAxNyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0NUNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjIiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDEwKTsmI3hBOyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFJiN4QTspOyYjeEE7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUSElTX0ZPUkUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMCwgMCk7JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZpbHRlclVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGaWx0ZXJVbml0L2lucHV0UG9ydCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiDQorICAgICAgICAgIHZpc3VhbElEPSI1MDE0Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZTVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtNdWx0aUlucHV0UG9ydCZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMTgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVPdXRwdXRQb3J0MkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydDJDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEwL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlT3V0cHV0UG9ydEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlT3V0cHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZU91dHB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpEZWZhdWx0U2l6ZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgd2lkdGg9IjIwIg0KKyAgICAgICAgICAgIGhlaWdodD0iMjAiLz4NCisgICAgICA8L3ZpZXdtYXA+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZU91dHB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZpbHRlclVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdC9vdXRwdXRQb3J0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMTUiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnROYW1lVHlwZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVPdXRwdXRQb3J0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZU91dHB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVPdXRwdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZU91dHB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90O1NpbmdsZU91dHB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMTkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIwIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiDQorICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdEVkaXRIZWxwZXIiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O011bHRpRmlsdGVyVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmlsdGVyVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDE5Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZpbHRlclVuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMjAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ2RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0NkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ2R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDZDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpSW5wdXRQb3J0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldExpbmVXaWR0aCgxMCk7JiN4QTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKFRISVNfRk9SRSYjeEE7KTsmI3hBO3RoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgVEhJU19GT1JFID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDAsIDApOyYjeEE7JiN4QTsiPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyINCisgICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiLz4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpEZWZhdWx0U2l6ZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgd2lkdGg9IjIwIg0KKyAgICAgICAgICAgIGhlaWdodD0iMjAiLz4NCisgICAgICA8L3ZpZXdtYXA+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpSW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZpbHRlclVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZpbHRlclVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMTciDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlNkVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlNkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90O011bHRpSW5wdXRQb3J0JnF1b3Q7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUG9ydC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ2hpbGRTaWRlQWZmaXhlZE5vZGUiDQorICAgICAgICB2aXN1YWxJRD0iMzAyMSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpT3V0cHV0UG9ydFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlPdXRwdXRQb3J0MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlPdXRwdXRQb3J0MkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlPdXRwdXRQb3J0MkNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjMiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTQvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpT3V0cHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpT3V0cHV0UG9ydEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMTApOyYjeEE7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihUSElTX0ZPUkUmI3hBOyk7JiN4QTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRISVNfRk9SRSA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAwLCAwKTsmI3hBOyYjeEE7Ij4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIi8+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aU91dHB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmlsdGVyVW5pdC9vdXRwdXRQb3J0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZpbHRlclVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiDQorICAgICAgICAgIHZpc3VhbElEPSI1MDE4Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlPdXRwdXRQb3J0TmFtZVR5cGUyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpT3V0cHV0UG9ydE5hbWVUeXBlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpT3V0cHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aU91dHB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aU91dHB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtNdWx0aU91dHB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMjIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjkiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQyQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiDQorICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1NpbmdsZVF1ZXVlZFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA3NiINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDJFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMjMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0NkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDZDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDZHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDZDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjYgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvc2luZ2xlSW5wdXRQb3J0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9zaW5nbGVJbnB1dFBvcnRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMjAiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTZFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90O1NpbmdsZUlucHV0UG9ydCZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMjQiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ3R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDdDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjYgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpSW5wdXRQb3J0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldExpbmVXaWR0aCgxMCk7JiN4QTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKFRISVNfRk9SRSYjeEE7KTsmI3hBO3RoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgVEhJU19GT1JFID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDAsIDApOyYjeEE7JiN4QTsiPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyINCisgICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiLz4NCisgICAgICAgIDxhdHRyaWJ1dGVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpEZWZhdWx0U2l6ZUF0dHJpYnV0ZXMiDQorICAgICAgICAgICAgd2lkdGg9IjIwIg0KKyAgICAgICAgICAgIGhlaWdodD0iMjAiLz4NCisgICAgICA8L3ZpZXdtYXA+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpSW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L211bHRpSW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L211bHRpSW5wdXRQb3J0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMjEiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlN0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90O011bHRpSW5wdXRQb3J0JnF1b3Q7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUG9ydC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDI1Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIg0KKyAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTAgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjExIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy45IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NyI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDYXJ0ZXNpYW5RdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNzUiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q0RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMjYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTMiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDJDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjExIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSINCisgICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1NlcXVlbnRpYWxVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA3NCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3QySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L3R5cGUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNoaWxkU2lkZUFmZml4ZWROb2RlIg0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMjciDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0N0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDdDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDdHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDdDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzIgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIg0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAyMiINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlN0VkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZTdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7U2luZ2xlSW5wdXRQb3J0JnF1b3Q7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUG9ydC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ2hpbGRTaWRlQWZmaXhlZE5vZGUiDQorICAgICAgICB2aXN1YWxJRD0iMzAyOCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDhFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0OEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ4Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDhHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0OENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDEwKTsmI3hBOyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFJiN4QTspOyYjeEE7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUSElTX0ZPUkUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMCwgMCk7JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIg0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAyMyINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGU4RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0TmFtZVR5cGU4SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7TXVsdGlJbnB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMjkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xNCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTUiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41OSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43OSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDYXJ0ZXNpYW5RdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDczIg0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0Vmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3R5cGUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDMwIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE5Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDJDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjExIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSINCisgICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RWRpdEhlbHBlciIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ29uZGl0aW9uYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDb25kaXRpb25hbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNzIiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXROYW1lVHlwZTJFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DaGlsZFNpZGVBZmZpeGVkTm9kZSINCisgICAgICAgIHZpc3VhbElEPSIzMDMxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDhFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDhJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ4Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ4R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ4Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0IC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlSW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvaW5wdXRQb3J0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkV4dGVybmFsTm9kZUxhYmVsIg0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAyNCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOEVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZThJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7U2luZ2xlSW5wdXRQb3J0JnF1b3Q7KTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUG9ydC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ2hpbGRTaWRlQWZmaXhlZE5vZGUiDQorICAgICAgICB2aXN1YWxJRD0iMzAzMiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDlFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0OUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnQ5Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydDlHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0OUNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpSW5wdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTXVsdGlJbnB1dFBvcnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDEwKTsmI3hBOyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoVEhJU19GT1JFJiN4QTspOyYjeEE7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7c3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBUSElTX0ZPUkUgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMCwgMCk7JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9pbnB1dFBvcnRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvaW5wdXRQb3J0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiDQorICAgICAgICAgIHZpc3VhbElEPSI1MDI1Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlJbnB1dFBvcnROYW1lVHlwZTlJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtNdWx0aUlucHV0UG9ydCZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzAzMyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0NkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yMSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0NkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDZDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjgyIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O0NhcnRlc2lhblF1ZXVlZFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvdGhlbiIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAyOCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzAzNCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBdG9taWNVbml0MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQXRvbWljVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQXRvbWljVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQXRvbWljVW5pdDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0MkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iQXRvbWljVW5pdDJDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjExIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSINCisgICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQXRvbWljVW5pdEVkaXRIZWxwZXIiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IkF0b21pY1VuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIEF0b21pY1VuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBBdG9taWNVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O0F0b21pY1VuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAyNyINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGUyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGUySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQXRvbWljVW5pdExhYmVsVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0L2xhYmVsIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DaGlsZFNpZGVBZmZpeGVkTm9kZSINCisgICAgICAgIHZpc3VhbElEPSIzMDM1Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDlFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydDlJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ5Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ5R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnQ5Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3IC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNiI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiPg0KKyAgICAgICAgPGF0dHJpYnV0ZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkRlZmF1bHRTaXplQXR0cmlidXRlcyINCisgICAgICAgICAgICB3aWR0aD0iMjAiDQorICAgICAgICAgICAgaGVpZ2h0PSIyMCIvPg0KKyAgICAgIDwvdmlld21hcD4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlSW5wdXRQb3J0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0L2lucHV0UG9ydHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0F0b21pY1VuaXQvaW5wdXRQb3J0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiDQorICAgICAgICAgIHZpc3VhbElEPSI1MDI2Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0TmFtZVR5cGU5RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlOUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtTaW5nbGVJbnB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMzYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0M0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yMyINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44MiI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1BhcmFsbGVsUXVldWVkVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC90aGVuIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNzEiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3R5cGUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMzciDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI0IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQ0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQ0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjMzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc1Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7UGFyYWxsZWxRdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA3MCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzAzOCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdDJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDAgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlRmVhdHVyZVVuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGZWF0dXJlVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAyOSINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGUySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZlYXR1cmVVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwMzkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE0Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXQyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0MkNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDAgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUZlYXR1cmVVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O011bHRpRmVhdHVyZVVuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZlYXR1cmVVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDMwIg0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlMkVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZlYXR1cmVVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNDAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNyINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0MkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdDJDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI0IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yOCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzQiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtTaW5nbGVGaWx0ZXJVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAzMSINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTJFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDQxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQyQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjMyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc0Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpRmlsdGVyVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7TXVsdGlGaWx0ZXJVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlGaWx0ZXJVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDMyIg0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGUyRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdE5hbWVUeXBlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmlsdGVyVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDQyIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQzRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjciDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQzQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc1Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIxL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtTaW5nbGVRdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNjkiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3QzRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNDMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yOSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQ1R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQ1Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc3Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7UGFyYWxsZWxRdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA2OCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA0NCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNyINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjMwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0M0NyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjIzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2VxdWVudGlhbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDY3Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0Vmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDQ1Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzMiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0NkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41OSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjMxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzkiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMy9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtQYXJhbGxlbFF1ZXVlZFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA2NiINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NkVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA0NiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQzRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzEiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjM2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNyINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQzQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc1Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ29uZGl0aW9uYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDb25kaXRpb25hbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNjUiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXROYW1lVHlwZTNFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNDciDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zOCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzkiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdDdHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44MyI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDYXJ0ZXNpYW5RdWV1ZWRVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9lbHNlIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMzMiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNDgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0N0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdDdDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQ3R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44MyI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1BhcmFsbGVsUXVldWVkVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9lbHNlIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMzUiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDdFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3R5cGUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNDkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQXRvbWljVW5pdDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkF0b21pY1VuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzQiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQXRvbWljVW5pdDNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkF0b21pY1VuaXQzQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc1Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMzL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQXRvbWljVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgQXRvbWljVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIEF0b21pY1VuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7QXRvbWljVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0F0b21pY1VuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDM0Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQXRvbWljVW5pdExhYmVsVHlwZTNFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQXRvbWljVW5pdExhYmVsVHlwZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0F0b21pY1VuaXQvbGFiZWwiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0F0b21pY1VuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA1MCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdDNHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0M0NyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjcxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuODEiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNy9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVGZWF0dXJlVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVGZWF0dXJlVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1NpbmdsZUZlYXR1cmVVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmVhdHVyZVVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMzYiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0VkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGZWF0dXJlVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDUxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXQzRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0M0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0M0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdDNDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjM1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjgxIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7TXVsdGlGZWF0dXJlVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMzciDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGUzRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA1MiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0M0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdDNDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE3Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXQzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0M0NyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjcxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuODEiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtTaW5nbGVGaWx0ZXJVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAzOCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTNFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDUzIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQzQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44MSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOC9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlGaWx0ZXJVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aUZpbHRlclVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O011bHRpRmlsdGVyVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmlsdGVyVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTAzOSINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdE5hbWVUeXBlM0VkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXROYW1lVHlwZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZpbHRlclVuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA1NCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIzIg0KKyAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQzIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQ0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0NENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjM2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xOCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuODIiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1NpbmdsZVF1ZXVlZFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvdGhlbiIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA2NCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA1NSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdDRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0NENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ0IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40OCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NiI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlRmVhdHVyZVVuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGZWF0dXJlVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDQwIg0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXROYW1lVHlwZTRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmVhdHVyZVVuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA1NiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEzIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTQiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdDRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXQ0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjYgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc2Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7TXVsdGlGZWF0dXJlVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA0MSINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXROYW1lVHlwZTRFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlGZWF0dXJlVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDU3Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXQ0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTciDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdDRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjYgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc2Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlRmlsdGVyVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZpbHRlclVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA0MiINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDU4Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQ0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXQ0Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40MiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMjYgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc2Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpRmlsdGVyVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7TXVsdGlGaWx0ZXJVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlGaWx0ZXJVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNDMiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXROYW1lVHlwZTRFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGU0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlGaWx0ZXJVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNTkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ0IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0NUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDVDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40OSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4yNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzciPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1NpbmdsZVF1ZXVlZFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA2MyINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDVFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdFZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L2xibFN0cmljdCIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA2MCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNyINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NyINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0NENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU1IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy45IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NyI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2VxdWVudGlhbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDYyIg0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0Vmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDYxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy44IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEwIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0NUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXQ1Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTYgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42OCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzAgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43OCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUZlYXR1cmVVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlRmVhdHVyZVVuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNpbmdsZUZlYXR1cmVVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGZWF0dXJlVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNDQiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGZWF0dXJlVW5pdE5hbWVUeXBlNUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZlYXR1cmVVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGZWF0dXJlVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDYyIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmVhdHVyZVVuaXQ1RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0NUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdDVDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc4Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExL0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpRmVhdHVyZVVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7TXVsdGlGZWF0dXJlVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVNdWx0aUZlYXR1cmVVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpRmVhdHVyZVVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDQ1Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlNUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZlYXR1cmVVbml0TmFtZVR5cGU1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlGZWF0dXJlVW5pdE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZlYXR1cmVVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNjMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZUZpbHRlclVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNyINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0NUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc4Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZUZpbHRlclVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlRmlsdGVyVW5pdCZxdW90Oyk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZUZpbHRlclVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NlcXVlbnRpYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDQ2Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVGaWx0ZXJVbml0TmFtZVR5cGU1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlRmlsdGVyVW5pdE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVNpbmdsZUZpbHRlclVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVGaWx0ZXJVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNjQiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIwIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdDVDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY4IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc4Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlGaWx0ZXJVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpRmlsdGVyVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7TXVsdGlGaWx0ZXJVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZU11bHRpRmlsdGVyVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlGaWx0ZXJVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA0NyINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpRmlsdGVyVW5pdE5hbWVUeXBlNUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXROYW1lVHlwZTVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNdWx0aUZpbHRlclVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVNdWx0aUZpbHRlclVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aUZpbHRlclVuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L2NoaWxkTm9kZXM+DQorICAgIDxjaGlsZE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMzA2NSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0NkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDZDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIzIg0KKyAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ5Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQ2R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0NkNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42OSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjMxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xMyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzkiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVRdWV1ZWRVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O1NpbmdsZVF1ZXVlZFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNjEiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q2RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNjYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIg0KKyAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTAgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41MiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTMiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0NEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0NENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy45IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NyI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgQ29uZGl0aW9uYWxVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIENvbmRpdGlvbmFsVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7Q29uZGl0aW9uYWxVbml0JnF1b3Q7KTsmI3hBO2ZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDYwIg0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU0RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDY3Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTUiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdDdHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXQ3Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41MyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43MyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44MyI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlUXVldWVkVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9lbHNlIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvZWxzZSIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDQ5Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3Q3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0Vmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L3R5cGUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDY4Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkF0b21pY1VuaXQ0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBdG9taWNVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0NENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXQ0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJBdG9taWNVbml0NENyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTUgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNDMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjI3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy45IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NyI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMy9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IkF0b21pY1VuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIEF0b21pY1VuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBBdG9taWNVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O0F0b21pY1VuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA0OCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGU0RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGU0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQXRvbWljVW5pdExhYmVsVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0L2xhYmVsIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNjkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQ1RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0NUNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTciDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQ1R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDVDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjgyIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtTZXF1ZW50aWFsVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC90aGVuIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNTkiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNzAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQ2RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41OCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTkiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQ2R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDZDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42OSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc5Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtTZXF1ZW50aWFsVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDU4Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0Vmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDcxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYzIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDVDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY5IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41OSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTcgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjQ3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zMSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc5Ij4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ29uZGl0aW9uYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDb25kaXRpb25hbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDU3Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU1RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlNUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDcyIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY0IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjYgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY3Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDZHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDZDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43MiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUyIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTggLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjgyIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ29uZGl0aW9uYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDb25kaXRpb25hbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC90aGVuIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNTYiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXROYW1lVHlwZTZFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNzMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42OCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjkiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXQ3R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdDdDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43MyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjgzIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNlcXVlbnRpYWxVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2VxdWVudGlhbFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtTZXF1ZW50aWFsVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZS5zZXRNYXhpbXVtU2l6ZShuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMDAwKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSYjeEE7KSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9lbHNlIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNTEiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0VkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdE5hbWVUeXBlTGJsU3RyaWN0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNzQiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQXRvbWljVW5pdDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkF0b21pY1VuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzQiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQXRvbWljVW5pdDVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkF0b21pY1VuaXQ1Q3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42OSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjU3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy40NyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43OSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMy9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IkF0b21pY1VuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIEF0b21pY1VuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBBdG9taWNVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O0F0b21pY1VuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNTAiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlNUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlNUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdC9sYWJlbCIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDc1Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXQ3Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjcwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43MSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjczIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDdHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdDdDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjczIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42NyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjUzIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4zNyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMTkgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjgzIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ29uZGl0aW9uYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDb25kaXRpb25hbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9lbHNlIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNTUiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXROYW1lVHlwZTdFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGU3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC9jaGlsZE5vZGVzPg0KKyAgICA8Y2hpbGROb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjMwNzYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uQ2hlY2tFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbkNoZWNrSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbkNoZWNrVmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25DaGVja0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uQ2hlY2tHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNvbmRpdGlvbkNoZWNrQ3JlYXRlQ29tbWFuZCINCisgICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43MCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNjQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjYwIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy41MCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMzQgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjE2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44MCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiDQorICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkNvbmRpdGlvbkNoZWNrRWRpdEhlbHBlciIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ29uZGl0aW9uQ2hlY2tGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlQ29uZGl0aW9uQ2hlY2tMYWJlbEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIENvbmRpdGlvbkNoZWNrRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDb25kaXRpb25DaGVja0xhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVDb25kaXRpb25DaGVja0xhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7Q29uZGl0aW9uQ2hlY2smcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQ29uZGl0aW9uQ2hlY2tMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uQ2hlY2tMYWJlbEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkZpZ3VyZUNvbmRpdGlvbkNoZWNrTGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25DaGVjayIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2lmIi8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvaWYiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA1MiINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbkNoZWNrTmFtZVR5cGVTcGVjRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbkNoZWNrTmFtZVR5cGVTcGVjSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uQ2hlY2tOYW1lVHlwZVNwZWNWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ29uZGl0aW9uQ2hlY2tMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25DaGVjay90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25DaGVjay9zcGVjIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDc3Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkF0b21pY1VuaXQ2RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBdG9taWNVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0NkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXQ2R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJBdG9taWNVbml0NkNyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42MiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTIgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjM2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xOCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuODIiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJBdG9taWNVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBBdG9taWNVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQXRvbWljVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtBdG9taWNVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC90aGVuIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNTMiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlNkVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlNkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdC9sYWJlbCIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPGNoaWxkTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIzMDc4Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkF0b21pY1VuaXQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBdG9taWNVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ig0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXQ3R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJBdG9taWNVbml0N0NyZWF0ZUNvbW1hbmQiDQorICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjY3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy42MyAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNTMgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjM3IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xOSAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuODMiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMvQGVsZW1lbnRUeXBlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJBdG9taWNVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBBdG9taWNVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQXRvbWljVW5pdEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7KSk7JiN4QTt0aGlzLnNldEJvcmRlcihuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcihnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTspKTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTtmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtBdG9taWNVbml0JnF1b3Q7KTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdC9lbHNlIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwNTQiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlN0VkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlN0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGVWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdC9sYWJlbCIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQXRvbWljVW5pdC90eXBlIi8+DQorICAgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPC9sYWJlbHM+DQorICAgIDwvY2hpbGROb2Rlcz4NCisgICAgPHRvcExldmVsTm9kZXMNCisgICAgICAgIHZpc3VhbElEPSIyMDAxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlSW5wdXRQb3J0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydENyZWF0ZUNvbW1hbmQiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIg0KKyAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+DQorICAgICAgICA8YXR0cmlidXRlcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RGVmYXVsdFNpemVBdHRyaWJ1dGVzIg0KKyAgICAgICAgICAgIHdpZHRoPSIyMCINCisgICAgICAgICAgICBoZWlnaHQ9IjIwIi8+DQorICAgICAgPC92aWV3bWFwPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TaW5nbGVJbnB1dFBvcnQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL01vZGVsUmVmYWN0b3JpbmcvaW5wdXRQb3J0cyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTW9kZWxSZWZhY3RvcmluZy9pbnB1dFBvcnRzIi8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCINCisgICAgICAgICAgdmlzdWFsSUQ9IjUwMDEiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZUVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnROYW1lVHlwZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZUlucHV0UG9ydE5hbWVUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgeyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDtTaW5nbGVJbnB1dFBvcnQmcXVvdDspOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Qb3J0L3R5cGUiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC90b3BMZXZlbE5vZGVzPg0KKyAgICA8dG9wTGV2ZWxOb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjIwMDIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDcmVhdGVDb21tYW5kIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSINCisgICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEVkaXRIZWxwZXIiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIENhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7Q2FydGVzaWFuUXVldWVkVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUNhcnRlc2lhblF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA4MCINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ2FydGVzaWFuUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC90b3BMZXZlbE5vZGVzPg0KKyAgICA8dG9wTGV2ZWxOb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjIwMDMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc0IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NSINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdENyZWF0ZUNvbW1hbmQiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiDQorICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMy9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGUgeyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtQYXJhbGxlbFF1ZXVlZFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGdldEZpZ3VyZVBhcmFsbGVsUXVldWVkVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxiZWhhdmlvdXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpPcGVuRGlhZ3JhbUJlaGF2aW91ciIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9QYXJhbGxlbFF1ZXVlZFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA4MSINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0RWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdE5hbWVUeXBlTGJsU3RyaWN0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIi8+DQorICAgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCINCisgICAgICAgICAgICBwYXJzZXI9Ii8vQGxhYmVsUGFyc2Vycy9AaW1wbGVtZW50YXRpb25zLjAiDQorICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0L3R5cGUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC90b3BMZXZlbE5vZGVzPg0KKyAgICA8dG9wTGV2ZWxOb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjIwMDQiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyINCisgICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjc2IC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43NyINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0Q3JlYXRlQ29tbWFuZCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Q29ybmVyRGltZW5zaW9ucyhuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbihnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoOCkmI3hBOykpOyYjeEE7dGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7KSk7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4QTsmI3hBOyYjeEE7ZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2luZ2xlUXVldWVkVW5pdCZxdW90Oyk7JiN4QTtmRmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVTaW5nbGVRdWV1ZWRVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA4MiINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXROYW1lVHlwZUxibFN0cmljdEVkaXRQYXJ0Ig0KKyAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2luZ2xlUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCIvPg0KKyAgICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiDQorICAgICAgICAgICAgcGFyc2VyPSIvL0BsYWJlbFBhcnNlcnMvQGltcGxlbWVudGF0aW9ucy4wIg0KKyAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0gLXsyfS0iDQorICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8bWV0YUZlYXR1cmVzDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC90b3BMZXZlbE5vZGVzPg0KKyAgICA8dG9wTGV2ZWxOb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjIwMDUiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy43OCAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuNzkiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRHcmFwaGljYWxOb2RlRWRpdFBvbGljeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0Q3JlYXRlQ29tbWFuZCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNS9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBTZXF1ZW50aWFsVW5pdEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlIHsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZTsgJiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIFNlcXVlbnRpYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwoKTsmI3hBO2ZGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlLnNldFRleHQoJnF1b3Q7U2VxdWVudGlhbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUuc2V0TWF4aW11bVNpemUobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDAwMCkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkmI3hBOykpOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUuc2V0T3V0bGluZShmYWxzZSk7JiN4QTsmI3hBO3RoaXMuYWRkKGZTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8YmVoYXZpb3VyDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46T3BlbkRpYWdyYW1CZWhhdmlvdXIiLz4NCisgICAgICA8bW9kZWxGYWNldD4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2VxdWVudGlhbFVuaXQiLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGxhYmVscw0KKyAgICAgICAgICB2aXN1YWxJRD0iNTA4MyINCisgICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXROYW1lVHlwZUxibFN0cmljdEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0TmFtZVR5cGVMYmxTdHJpY3RWaWV3RmFjdG9yeSI+DQorICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICAgIDx2aWV3bWFwDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlU2VxdWVudGlhbFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC90eXBlIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8L2xhYmVscz4NCisgICAgPC90b3BMZXZlbE5vZGVzPg0KKyAgICA8dG9wTGV2ZWxOb2Rlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjIwMDYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIg0KKyAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuODAgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjgxIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy44MiAvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuODMiDQorICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDcmVhdGVDb21tYW5kIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIg0KKyAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5L0BlbGVtZW50VHlwZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0RmlndXJlIg0KKyAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsgJiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7ICYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBmQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlOyAmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgQ29uZGl0aW9uYWxVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsKCk7JiN4QTtmRmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUuc2V0VGV4dCgmcXVvdDtDb25kaXRpb25hbFVuaXQmcXVvdDspOyYjeEE7ZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlLnNldE1heGltdW1TaXplKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwMDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApJiN4QTspKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkZpZ3VyZUNvbmRpdGlvbmFsVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUoKTsmI3hBO2ZDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUpOyYjeEE7JiN4QTsmI3hBOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlKCk7JiN4QTtmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7JiN4QTt0aGlzLmFkZChmQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3hBO2ZDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSgpOyYjeEE7ZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZS5zZXRPdXRsaW5lKGZhbHNlKTsmI3hBOyYjeEE7dGhpcy5hZGQoZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSk7JiN4QTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwgZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSBnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIGdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPGJlaGF2aW91cg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk9wZW5EaWFncmFtQmVoYXZpb3VyIi8+DQorICAgICAgPG1vZGVsRmFjZXQ+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29tcG9zaXRlUmVmYWN0b3JpbmcvbWFpblJlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29tcG9zaXRlUmVmYWN0b3JpbmcvbWFpblJlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8bGFiZWxzDQorICAgICAgICAgIHZpc3VhbElEPSI1MDg0Ig0KKyAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVFZGl0UGFydCINCisgICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0TmFtZVR5cGVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXROYW1lVHlwZVZpZXdGYWN0b3J5Ij4NCisgICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgICAgPHZpZXdtYXANCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVDb25kaXRpb25hbFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgIDxtZXRhRmVhdHVyZXMNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db25kaXRpb25hbFVuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L3RvcExldmVsTm9kZXM+DQorICAgIDx0b3BMZXZlbE5vZGVzDQorICAgICAgICB2aXN1YWxJRD0iMjAwNyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBdG9taWNVbml0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkF0b21pY1VuaXRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNCINCisgICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBdG9taWNVbml0R3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJBdG9taWNVbml0Q3JlYXRlQ29tbWFuZCI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDxlbGVtZW50VHlwZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSINCisgICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMy9AZWxlbWVudFR5cGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9IkF0b21pY1VuaXRGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIEF0b21pY1VuaXRGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZSB7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwcGluZ0xhYmVsIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7ICYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBBdG9taWNVbml0RmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldENvcm5lckRpbWVuc2lvbnMobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb24oZ2V0TWFwTW9kZSgpLkRQdG9MUCg4KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpJiN4QTspKTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkmI3hBOykpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBO2ZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCgpOyYjeEE7ZkZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZS5zZXRUZXh0KCZxdW90O0F0b21pY1VuaXQmcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChmRmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlKTsmI3hBOyYjeEE7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcHBpbmdMYWJlbCBnZXRGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZGaWd1cmVBdG9taWNVbml0TGFiZWxGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0Pg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9BdG9taWNVbml0Ii8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db21wb3NpdGVSZWZhY3RvcmluZy9tYWluUmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db21wb3NpdGVSZWZhY3RvcmluZy9tYWluUmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxsYWJlbHMNCisgICAgICAgICAgdmlzdWFsSUQ9IjUwODUiDQorICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlRWRpdFBhcnQiDQorICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkF0b21pY1VuaXRMYWJlbFR5cGVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBdG9taWNVbml0TGFiZWxUeXBlVmlld0ZhY3RvcnkiPg0KKyAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgICA8dmlld21hcA0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUF0b21pY1VuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWwiLz4NCisgICAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ig0KKyAgICAgICAgICAgIHBhcnNlcj0iLy9AbGFiZWxQYXJzZXJzL0BpbXBsZW1lbnRhdGlvbnMuMCINCisgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0F0b21pY1VuaXQvbGFiZWwiLz4NCisgICAgICAgICAgPG1ldGFGZWF0dXJlcw0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0F0b21pY1VuaXQvdHlwZSIvPg0KKyAgICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDwvbGFiZWxzPg0KKyAgICA8L3RvcExldmVsTm9kZXM+DQorICAgIDxsaW5rcw0KKyAgICAgICAgdmlzdWFsSUQ9IjQwMDEiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVBvcnRNYXBwaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVBvcnRNYXBwaW5nVmlld0ZhY3RvcnkiDQorICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQiDQorICAgICAgICByZW9yaWVudENvbW1hbmRDbGFzc05hbWU9IlNpbmdsZVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSINCisgICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iU2luZ2xlUG9ydE1hcHBpbmdFZGl0SGVscGVyIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCINCisgICAgICAgICAgY2xhc3NOYW1lPSJTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExpbmVXaWR0aCgyKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX0RPVCk7JiN4QTsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUm90YXRhYmxlRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTt9JiN4QTsmI3hBOyIvPg0KKyAgICAgIDxtb2RlbEZhY2V0DQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4NCisgICAgICAgIDxtZXRhQ2xhc3MNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUG9ydE1hcHBpbmciLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL3BvcnRNYXBwaW5ncyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29tcG9zaXRlUmVmYWN0b3JpbmcvcG9ydE1hcHBpbmdzIi8+DQorICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUG9ydE1hcHBpbmcvc291cmNlIi8+DQorICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvU2luZ2xlUG9ydE1hcHBpbmcvdGFyZ2V0Ii8+DQorICAgICAgPC9tb2RlbEZhY2V0Pg0KKyAgICAgIDxjcmVhdGlvbkNvbnN0cmFpbnRzDQorICAgICAgICAgIHNvdXJjZUVuZD0iLy9AZXhwcmVzc2lvblByb3ZpZGVycy9AcHJvdmlkZXJzLjAvQGV4cHJlc3Npb25zLjAiLz4NCisgICAgPC9saW5rcz4NCisgICAgPGxpbmtzDQorICAgICAgICB2aXN1YWxJRD0iNDAwMiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNdWx0aVBvcnRNYXBwaW5nRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNdWx0aVBvcnRNYXBwaW5nSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik11bHRpUG9ydE1hcHBpbmdWaWV3RmFjdG9yeSINCisgICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9Ik11bHRpUG9ydE1hcHBpbmdDcmVhdGVDb21tYW5kIg0KKyAgICAgICAgcmVvcmllbnRDb21tYW5kQ2xhc3NOYW1lPSJNdWx0aVBvcnRNYXBwaW5nUmVvcmllbnRDb21tYW5kIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+DQorICAgICAgPGVsZW1lbnRUeXBlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSINCisgICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTXVsdGlQb3J0TWFwcGluZ0VkaXRIZWxwZXIiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIg0KKyAgICAgICAgICBjbGFzc05hbWU9Ik11bHRpUG9ydE1hcHBpbmdGaWd1cmUiDQorICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIE11bHRpUG9ydE1hcHBpbmdGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeCB7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBNdWx0aVBvcnRNYXBwaW5nRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGluZVdpZHRoKDIpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfRE9UKTsmI3hBOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3RhdGFibGVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ii8+DQorICAgICAgPG1vZGVsRmFjZXQNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPg0KKyAgICAgICAgPG1ldGFDbGFzcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aVBvcnRNYXBwaW5nIi8+DQorICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9Db21wb3NpdGVSZWZhY3RvcmluZy9wb3J0TWFwcGluZ3MiLz4NCisgICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL3BvcnRNYXBwaW5ncyIvPg0KKyAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpUG9ydE1hcHBpbmcvc291cmNlIi8+DQorICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlQb3J0TWFwcGluZy90YXJnZXQiLz4NCisgICAgICA8L21vZGVsRmFjZXQ+DQorICAgICAgPGNyZWF0aW9uQ29uc3RyYWludHMNCisgICAgICAgICAgc291cmNlRW5kPSIvL0BleHByZXNzaW9uUHJvdmlkZXJzL0Bwcm92aWRlcnMuMC9AZXhwcmVzc2lvbnMuMSIvPg0KKyAgICA8L2xpbmtzPg0KKyAgICA8bGlua3MNCisgICAgICAgIHZpc3VhbElEPSI0MDAzIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik11bHRpU2luZ2xlUG9ydE1hcHBpbmdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik11bHRpU2luZ2xlUG9ydE1hcHBpbmdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZ1ZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0NyZWF0ZUNvbW1hbmQiDQorICAgICAgICByZW9yaWVudENvbW1hbmRDbGFzc05hbWU9Ik11bHRpU2luZ2xlUG9ydE1hcHBpbmdSZW9yaWVudENvbW1hbmQiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4NCisgICAgICA8ZWxlbWVudFR5cGUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIg0KKyAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRWRpdEhlbHBlciIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiDQorICAgICAgICAgIGNsYXNzTmFtZT0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSINCisgICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHVibGljIE11bHRpU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMik7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9ET1QpOyYjeEE7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdGF0YWJsZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7fSYjeEE7JiN4QTsiLz4NCisgICAgICA8bW9kZWxGYWNldA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+DQorICAgICAgICA8bWV0YUNsYXNzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL011bHRpU2luZ2xlUG9ydE1hcHBpbmciLz4NCisgICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdlbm1vZGVsIy8vY29tcmVsL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL3BvcnRNYXBwaW5ncyIvPg0KKyAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvQ29tcG9zaXRlUmVmYWN0b3JpbmcvcG9ydE1hcHBpbmdzIi8+DQorICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ2VubW9kZWwjLy9jb21yZWwvTXVsdGlTaW5nbGVQb3J0TWFwcGluZy9zb3VyY2UiLz4NCisgICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvL2NvbXJlbC9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nL3RhcmdldCIvPg0KKyAgICAgIDwvbW9kZWxGYWNldD4NCisgICAgICA8Y3JlYXRpb25Db25zdHJhaW50cw0KKyAgICAgICAgICBzb3VyY2VFbmQ9Ii8vQGV4cHJlc3Npb25Qcm92aWRlcnMvQHByb3ZpZGVycy4wL0BleHByZXNzaW9ucy4yIi8+DQorICAgIDwvbGlua3M+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDAxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCINCisgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMDIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMyINCisgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAwMyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTgiDQorICAgICAgICB0aXRsZT0iQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDA0Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMiDQorICAgICAgICB0aXRsZT0iQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMDUiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAiDQorICAgICAgICB0aXRsZT0iUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAwNiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ig0KKyAgICAgICAgdGl0bGU9IlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDA3Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCINCisgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMDgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMyINCisgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAwOSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ig0KKyAgICAgICAgdGl0bGU9IlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIxIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMTAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ig0KKyAgICAgICAgdGl0bGU9IlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAxMSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTgiDQorICAgICAgICB0aXRsZT0iQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAxMiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMzIg0KKyAgICAgICAgdGl0bGU9IkNhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAxMyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjMiDQorICAgICAgICB0aXRsZT0iU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDE0Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MyINCisgICAgICAgIHRpdGxlPSJTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDE1Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCINCisgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDE2Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMiDQorICAgICAgICB0aXRsZT0iQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDE3Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ig0KKyAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDE4Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUyIg0KKyAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDE5Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2Ig0KKyAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAyMCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NyINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjEiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4Ig0KKyAgICAgICAgdGl0bGU9IkNhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMyINCisgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAiDQorICAgICAgICB0aXRsZT0iUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjQiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OCINCisgICAgICAgIHRpdGxlPSJQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjUiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAiDQorICAgICAgICB0aXRsZT0iUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OCINCisgICAgICAgIHRpdGxlPSJQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjciDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NyINCisgICAgICAgIHRpdGxlPSJTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDI4Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NyINCisgICAgICAgIHRpdGxlPSJTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDEiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAiDQorICAgICAgICB0aXRsZT0iUGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMzAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OCINCisgICAgICAgIHRpdGxlPSJQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDIiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMzEiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIg0KKyAgICAgICAgdGl0bGU9IlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAzMiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzMiDQorICAgICAgICB0aXRsZT0iU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDMiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAzMyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MCINCisgICAgICAgIHRpdGxlPSJQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAzNCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ig0KKyAgICAgICAgdGl0bGU9IlBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAzNSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NSINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAzNiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MiINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzAzNyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQyRWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NiINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMzgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50MkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzciDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDM5Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCINCisgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENhcnRlc2lhblF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDQwIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNhcnRlc2lhblF1ZXVlZFVuaXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMiDQorICAgICAgICB0aXRsZT0iQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDQxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM3IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIg0KKyAgICAgICAgdGl0bGU9IlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDciDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDQyIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDgiDQorICAgICAgICB0aXRsZT0iUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDQzIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTciDQorICAgICAgICB0aXRsZT0iU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA0NCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50M0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjciDQorICAgICAgICB0aXRsZT0iU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDQ1Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTciDQorICAgICAgICB0aXRsZT0iU2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTgiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA0NiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjciDQorICAgICAgICB0aXRsZT0iU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDQ3Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50M0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MyINCisgICAgICAgIHRpdGxlPSJTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTkiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNDgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIg0KKyAgICAgICAgdGl0bGU9IlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNDkiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NyINCisgICAgICAgIHRpdGxlPSJTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDUwIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ1RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NyINCisgICAgICAgIHRpdGxlPSJTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjQiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNTEiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzUiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNTIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzSXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNTMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50M0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDNDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzYiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDU0Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDNJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQzQ2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ig0KKyAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA1NSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ig0KKyAgICAgICAgdGl0bGU9IlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNTYiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ig0KKyAgICAgICAgdGl0bGU9IlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA1NyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjMiDQorICAgICAgICB0aXRsZT0iU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDU4Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ0RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50NENhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MyINCisgICAgICAgIHRpdGxlPSJTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDU5Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MyINCisgICAgICAgIHRpdGxlPSJTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjkiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNjAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDVFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ1Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIg0KKyAgICAgICAgdGl0bGU9IlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNjEiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzUiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNjIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNjMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDRDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzYiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDY0Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDRJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ0Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ig0KKyAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA2NSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NSINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA2NiINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MiINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA2NyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ1SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NUNhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NiINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzEiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNjgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50NUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDVDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzciDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDY5Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50NkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MyINCisgICAgICAgIHRpdGxlPSJTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzIiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzAiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjggLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIg0KKyAgICAgICAgdGl0bGU9IlNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzEiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzUiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzMiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50NkVkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Nkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudDZDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzYiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDc0Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudDZJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ2Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ig0KKyAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA3NSINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MCINCisgICAgICAgIHRpdGxlPSJQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDc2Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlBhcmFsbGVsUXVldWVkVW5pdFBhcmFsbGVsUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDgiDQorICAgICAgICB0aXRsZT0iUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiDQorICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiDQorICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+DQorICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MNCisgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPg0KKyAgICAgIDx2aWV3bWFwDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIg0KKyAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzciDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTaW5nbGVRdWV1ZWRVbml0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NyINCisgICAgICAgIHRpdGxlPSJTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2luZ2xlUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzgiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU2luZ2xlUXVldWVkVW5pdFNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudDdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlNpbmdsZVF1ZXVlZFVuaXRTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ig0KKyAgICAgICAgdGl0bGU9IlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIg0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDc5Ig0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlNlcXVlbnRpYWxVbml0U2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MyINCisgICAgICAgIHRpdGxlPSJTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA4MCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTZXF1ZW50aWFsVW5pdFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50N0VkaXRQYXJ0Ig0KKyAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdJdGVtU2VtYW50aWNFZGl0UG9saWN5Ig0KKyAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU2VxdWVudGlhbFVuaXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudDdDYW5vbmljYWxFZGl0UG9saWN5Ig0KKyAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzMiDQorICAgICAgICB0aXRsZT0iU2VxdWVudGlhbFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldFNlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUiLz4NCisgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgIHZpc3VhbElEPSI3MDgxIg0KKyAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiDQorICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50Vmlld0ZhY3RvcnkiDQorICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ig0KKyAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSIvPg0KKyAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwODIiDQorICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudDdFZGl0UGFydCINCisgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRWaWV3RmFjdG9yeSINCisgICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQ3Q2Fub25pY2FsRWRpdFBvbGljeSINCisgICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIiDQorICAgICAgICB0aXRsZT0iQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIg0KKyAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ig0KKyAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPg0KKyAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzDQorICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4NCisgICAgICA8dmlld21hcA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCINCisgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA4MyINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0VGhlbkNvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzEgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NiINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICB2aXN1YWxJRD0iNzA4NCINCisgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3RWRpdFBhcnQiDQorICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb25kaXRpb25hbFVuaXRDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQ3SXRlbVNlbWFudGljRWRpdFBvbGljeSINCisgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbmRpdGlvbmFsVW5pdENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudFZpZXdGYWN0b3J5Ig0KKyAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29uZGl0aW9uYWxVbml0Q29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50N0Nhbm9uaWNhbEVkaXRQb2xpY3kiDQorICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NyINCisgICAgICAgIHRpdGxlPSJDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQiDQorICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSINCisgICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4NCisgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcw0KKyAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+DQorICAgICAgPHZpZXdtYXANCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiDQorICAgICAgICAgIGdldHRlck5hbWU9ImdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIi8+DQorICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICA8cGFsZXR0ZT4NCisgICAgICA8Z3JvdXBzDQorICAgICAgICAgIHRpdGxlPSJDb21wb3NpdGUgVW5pdHMiDQorICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9IkNhcnRlc2lhblF1ZXVlZFVuaXQiDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ2FydGVzaWFuUXVldWVkVW5pdCINCisgICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiIvPg0KKyAgICAgICAgPGVudHJpZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSINCisgICAgICAgICAgICB0aXRsZT0iQ29uZGl0aW9uQ2hlY2siDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29uZGl0aW9uQ2hlY2siDQorICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzUiLz4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdCINCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb25kaXRpb25hbFVuaXQiDQorICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0IC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSIvPg0KKyAgICAgICAgPGVudHJpZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSINCisgICAgICAgICAgICB0aXRsZT0iUGFyYWxsZWxRdWV1ZWRVbml0Ig0KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFBhcmFsbGVsUXVldWVkVW5pdCINCisgICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiLz4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9IlNlcXVlbnRpYWxVbml0Ig0KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFNlcXVlbnRpYWxVbml0Ig0KKyAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjkgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiLz4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9IlNpbmdsZVF1ZXVlZFVuaXQiDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU2luZ2xlUXVldWVkVW5pdCINCisgICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjYgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIi8+DQorICAgICAgPC9ncm91cHM+DQorICAgICAgPGdyb3Vwcw0KKyAgICAgICAgICB0aXRsZT0iQXRvbWljIFVuaXRzIg0KKyAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+DQorICAgICAgICA8ZW50cmllcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5Ig0KKyAgICAgICAgICAgIHRpdGxlPSJBdG9taWNVbml0Ig0KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEF0b21pY1VuaXQiDQorICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3IC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNiIvPg0KKyAgICAgIDwvZ3JvdXBzPg0KKyAgICAgIDxncm91cHMNCisgICAgICAgICAgdGl0bGU9IkZpbHRlciBVbml0cyINCisgICAgICAgICAgY29sbGFwc2U9InRydWUiPg0KKyAgICAgICAgPGVudHJpZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSINCisgICAgICAgICAgICB0aXRsZT0iTXVsdGlGaWx0ZXJVbml0Ig0KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE11bHRpRmlsdGVyVW5pdCINCisgICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIi8+DQorICAgICAgICA8ZW50cmllcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5Ig0KKyAgICAgICAgICAgIHRpdGxlPSJTaW5nbGVGaWx0ZXJVbml0Ig0KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFNpbmdsZUZpbHRlclVuaXQiDQorICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTYgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MiIvPg0KKyAgICAgIDwvZ3JvdXBzPg0KKyAgICAgIDxncm91cHMNCisgICAgICAgICAgdGl0bGU9IkZlYXR1cmUgVW5pdHMiDQorICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9Ik11bHRpRmVhdHVyZVVuaXQiDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTXVsdGlGZWF0dXJlVW5pdCINCisgICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgICAgICA8ZW50cmllcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5Ig0KKyAgICAgICAgICAgIHRpdGxlPSJTaW5nbGVGZWF0dXJlVW5pdCINCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTaW5nbGVGZWF0dXJlVW5pdCINCisgICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjAiLz4NCisgICAgICA8L2dyb3Vwcz4NCisgICAgICA8Z3JvdXBzDQorICAgICAgICAgIHRpdGxlPSJQb3J0cyINCisgICAgICAgICAgY29sbGFwc2U9InRydWUiPg0KKyAgICAgICAgPGVudHJpZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSINCisgICAgICAgICAgICB0aXRsZT0iTXVsdGlJbnB1dFBvcnQiDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTXVsdGlJbnB1dFBvcnQiDQorICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy45IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE5IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNyAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIi8+DQorICAgICAgICA8ZW50cmllcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5Ig0KKyAgICAgICAgICAgIHRpdGxlPSJNdWx0aU91dHB1dFBvcnQiDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTXVsdGlPdXRwdXRQb3J0Ig0KKyAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjAiLz4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9IlNpbmdsZUlucHV0UG9ydCINCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTaW5nbGVJbnB1dFBvcnQiDQorICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEyIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjIgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNiAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzQiLz4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9IlNpbmdsZU91dHB1dFBvcnQiDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU2luZ2xlT3V0cHV0UG9ydCINCisgICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE3Ii8+DQorICAgICAgPC9ncm91cHM+DQorICAgICAgPGdyb3Vwcw0KKyAgICAgICAgICB0aXRsZT0iTWFwcGluZ3MiDQorICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4NCisgICAgICAgIDxlbnRyaWVzDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiDQorICAgICAgICAgICAgdGl0bGU9Ik11bHRpUG9ydE1hcHBpbmciDQorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTXVsdGlQb3J0TWFwcGluZyINCisgICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMSIvPg0KKyAgICAgICAgPGVudHJpZXMNCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSINCisgICAgICAgICAgICB0aXRsZT0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZyINCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIg0KKyAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4yIi8+DQorICAgICAgICA8ZW50cmllcw0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5Ig0KKyAgICAgICAgICAgIHRpdGxlPSJTaW5nbGVQb3J0TWFwcGluZyINCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTaW5nbGVQb3J0TWFwcGluZyINCisgICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPg0KKyAgICAgIDwvZ3JvdXBzPg0KKyAgICA8L3BhbGV0dGU+DQorICAgIDxwcmVmZXJlbmNlUGFnZXMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSINCisgICAgICAgIGlEPSJjb21yZWwuZGlhZ3JhbS5nZW5lcmFsIg0KKyAgICAgICAgbmFtZT0iQ29tcmVsIERpYWdyYW0iPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiDQorICAgICAgICAgIGlEPSJjb21yZWwuZGlhZ3JhbS5hcHBlYXJhbmNlIg0KKyAgICAgICAgICBuYW1lPSJBcHBlYXJhbmNlIg0KKyAgICAgICAgICBraW5kPSJBcHBlYXJhbmNlIi8+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSINCisgICAgICAgICAgaUQ9ImNvbXJlbC5kaWFncmFtLmNvbm5lY3Rpb25zIg0KKyAgICAgICAgICBuYW1lPSJDb25uZWN0aW9ucyINCisgICAgICAgICAga2luZD0iQ29ubmVjdGlvbnMiLz4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIg0KKyAgICAgICAgICBpRD0iY29tcmVsLmRpYWdyYW0ucHJpbnRpbmciDQorICAgICAgICAgIG5hbWU9IlByaW50aW5nIg0KKyAgICAgICAgICBraW5kPSJQcmludGluZyIvPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiDQorICAgICAgICAgIGlEPSJjb21yZWwuZGlhZ3JhbS5ydWxlcnNBbmRHcmlkIg0KKyAgICAgICAgICBuYW1lPSJSdWxlcnMgQW5kIEdyaWQiDQorICAgICAgICAgIGtpbmQ9IlJ1bGVyc0FuZEdyaWQiLz4NCisgICAgPC9wcmVmZXJlbmNlUGFnZXM+DQorICA8L2RpYWdyYW0+DQorICA8cGx1Z2luDQorICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIj4NCisgICAgPHJlcXVpcmVkUGx1Z2lucz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2lucz4NCisgICAgPHJlcXVpcmVkUGx1Z2lucz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2lucz4NCisgIDwvcGx1Z2luPg0KKyAgPGVkaXRvci8+DQorICA8bmF2aWdhdG9yPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjciDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy44Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjgiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjgiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzciDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy44Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM3Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDciDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDkiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy44Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjAiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy45Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40NSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xOCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yOSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM3Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zOSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40MyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDgiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41NSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41OCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjUiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42NyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42MyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjkiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43MCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNDciLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40OSIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNTEiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41MiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNjYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy42OCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzIiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NCIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNzYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43NyIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ii8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzQiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGdyb3VwTmFtZT0ibGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjgiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjgiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy40Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy44Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjgiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEwIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEwIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTciDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTciDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGdyb3VwTmFtZT0ibGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy45Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy45Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEzIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIzIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yNyINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy45Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjkiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEzIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEzIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTYiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE5Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE5Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI3Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI3Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjEiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4xIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBncm91cE5hbWU9ImxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy44Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy44Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEyIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjYiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zMCINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4zNCINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9InRhcmdldCINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMzQiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjkiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOSINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTMiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTMiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE0Ig0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE0Ig0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xNiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMTkiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIwIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIwIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSINCisgICAgICAgIGdyb3VwTmFtZT0ic291cmNlIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yMyINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCINCisgICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiDQorICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4yIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiDQorICAgICAgICBncm91cE5hbWU9InNvdXJjZSINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgICA8Y2hpbGRSZWZlcmVuY2VzDQorICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMjciDQorICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiDQorICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIg0KKyAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+DQorICAgIDxjaGlsZFJlZmVyZW5jZXMNCisgICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMiINCisgICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIg0KKyAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIg0KKyAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiDQorICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4NCisgICAgPGNoaWxkUmVmZXJlbmNlcw0KKyAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxIg0KKyAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjIiDQorICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0Ig0KKyAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyINCisgICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPg0KKyAgPC9uYXZpZ2F0b3I+DQorICA8ZGlhZ3JhbVVwZGF0ZXIvPg0KKyAgPHByb3BlcnR5U2hlZXQ+DQorICAgIDx0YWJzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiDQorICAgICAgICBpRD0iYXBwZWFyYW5jZSIvPg0KKyAgICA8dGFicw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIg0KKyAgICAgICAgaUQ9ImRpYWdyYW0iLz4NCisgICAgPHRhYnMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ3VzdG9tUHJvcGVydHlUYWIiDQorICAgICAgICBpRD0iZG9tYWluIg0KKyAgICAgICAgbGFiZWw9IkNvcmUiPg0KKyAgICAgIDxmaWx0ZXINCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlVGFiRmlsdGVyIj4NCisgICAgICAgIDx0eXBlcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3PC90eXBlcz4NCisgICAgICAgIDx0eXBlcz5vcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ8L3R5cGVzPg0KKyAgICAgICAgPGdlbmVyYXRlZFR5cGVzPmFic3RyYWN0TmF2aWdhdG9ySXRlbTwvZ2VuZXJhdGVkVHlwZXM+DQorICAgICAgPC9maWx0ZXI+DQorICAgIDwvdGFicz4NCisgIDwvcHJvcGVydHlTaGVldD4NCisgIDxkb21haW5HZW5Nb2RlbA0KKyAgICAgIGhyZWY9ImNvbXJlbC5nZW5tb2RlbCMvIi8+DQorICA8ZXhwcmVzc2lvblByb3ZpZGVycz4NCisgICAgPHByb3ZpZGVycw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHByZXNzaW9uSW50ZXJwcmV0ZXIiPg0KKyAgICAgIDxleHByZXNzaW9ucw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkNvbnN0cmFpbnQiDQorICAgICAgICAgIGJvZHk9InNlbGYmbHQ7Pm9wcG9zaXRlRW5kIi8+DQorICAgICAgPGV4cHJlc3Npb25zDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuQ29uc3RyYWludCINCisgICAgICAgICAgYm9keT0ic2VsZiZsdDs+b3Bwb3NpdGVFbmQiLz4NCisgICAgICA8ZXhwcmVzc2lvbnMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5Db25zdHJhaW50Ig0KKyAgICAgICAgICBib2R5PSJzZWxmJmx0Oz5vcHBvc2l0ZUVuZCIvPg0KKyAgICA8L3Byb3ZpZGVycz4NCisgIDwvZXhwcmVzc2lvblByb3ZpZGVycz4NCisgIDxsYWJlbFBhcnNlcnMNCisgICAgICBleHRlbnNpYmxlVmlhU2VydmljZT0idHJ1ZSI+DQorICAgIDxpbXBsZW1lbnRhdGlvbnMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UHJlZGVmaW5lZFBhcnNlciINCisgICAgICAgIHVzZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMC9AbGFiZWxzLjAvQG1vZGVsRmFjZXQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEvQGxhYmVscy4wL0Btb2RlbEZhY2V0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuNC9AbGFiZWxzLjAvQG1vZGVsRmFjZXQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy41L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjgvQGxhYmVscy4wL0Btb2RlbEZhY2V0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuOS9AbGFiZWxzLjAvQG1vZGVsRmFjZXQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xMC9AbGFiZWxzLjAvQG1vZGVsRmFjZXQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy43L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEyL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEzL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE0L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjExL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE2L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE3L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE1L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE5L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIwL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjE4L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIyL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIzL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI2L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI3L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMwL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMxL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM0L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMzL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjMyL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM3L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM4L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM5L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQwL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ2L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ4L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ3L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ5L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUwL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUxL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUyL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU0L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU1L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU2L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU3L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYwL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYxL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYyL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYzL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY3L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY2L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjczL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcyL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc1L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc2L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc3L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjc0L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcxL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjcwL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY5L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY4L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY1L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjY0L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU5L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjU4L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjUzL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ1L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQ0L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQzL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQyL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjQxL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM2L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjM1L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI5L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI4L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI1L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjI0L0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIxL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjYvQGxhYmVscy4wL0Btb2RlbEZhY2V0IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMy9AbGFiZWxzLjAvQG1vZGVsRmFjZXQgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEvQGxhYmVscy4wL0Btb2RlbEZhY2V0IC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMi9AbGFiZWxzLjAvQG1vZGVsRmFjZXQgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zL0BsYWJlbHMuMC9AbW9kZWxGYWNldCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjQvQGxhYmVscy4wL0Btb2RlbEZhY2V0IC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNS9AbGFiZWxzLjAvQG1vZGVsRmFjZXQgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BsYWJlbHMuMC9AbW9kZWxGYWNldCIvPg0KKyAgPC9sYWJlbFBhcnNlcnM+DQorICA8Y29udGV4dE1lbnVzDQorICAgICAgY29udGV4dD0iLy9AZGlhZ3JhbSI+DQorICAgIDxpdGVtcw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMb2FkUmVzb3VyY2VBY3Rpb24iLz4NCisgIDwvY29udGV4dE1lbnVzPg0KKzwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5nbWZncmFwaCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvbW9kZWwvY29tcmVsLmdtZmdyYXBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGI0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5nbWZncmFwaApAQCAtMCwwICsxLDcxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCis8Z21mZ3JhcGg6Q2FudmFzIHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSINCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgeG1sbnM6Z21mZ3JhcGg9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDYvR3JhcGhpY2FsRGVmaW5pdGlvbiIgbmFtZT0iY29tcmVsIj4NCisgIDxmaWd1cmVzDQorICAgICAgbmFtZT0iRGVmYXVsdCI+DQorICAgIDxmaWd1cmVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVEZWNvcmF0aW9uIg0KKyAgICAgICAgbmFtZT0iU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmVUYXJnZXREZWNvcmF0aW9uIi8+DQorICAgIDxmaWd1cmVzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVEZWNvcmF0aW9uIg0KKyAgICAgICAgbmFtZT0iTXVsdGlQb3J0TWFwcGluZ0ZpZ3VyZVRhcmdldERlY29yYXRpb24iLz4NCisgICAgPGZpZ3VyZXMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZURlY29yYXRpb24iDQorICAgICAgICBuYW1lPSJNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRmlndXJlVGFyZ2V0RGVjb3JhdGlvbiIvPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9IkF0b21pY1VuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9IkF0b21pY1VuaXRGaWd1cmUiPg0KKyAgICAgICAgPGJvcmRlcg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpNYXJnaW5Cb3JkZXIiPg0KKyAgICAgICAgICA8aW5zZXRzDQorICAgICAgICAgICAgICB0b3A9IjUiDQorICAgICAgICAgICAgICBsZWZ0PSI1Ig0KKyAgICAgICAgICAgICAgYm90dG9tPSI1Ig0KKyAgICAgICAgICAgICAgcmlnaHQ9IjUiLz4NCisgICAgICAgIDwvYm9yZGVyPg0KKyAgICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIg0KKyAgICAgICAgICAgIG5hbWU9IkF0b21pY1VuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICB0ZXh0PSJBdG9taWNVbml0Ii8+DQorICAgICAgPC9hY3R1YWxGaWd1cmU+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0RmlndXJlQXRvbWljVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMC9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIi8+DQorICAgIDwvZGVzY3JpcHRvcnM+DQorICAgIDxkZXNjcmlwdG9ycw0KKyAgICAgICAgbmFtZT0iU2VxdWVudGlhbFVuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9IlNlcXVlbnRpYWxVbml0RmlndXJlIj4NCisgICAgICAgIDxib3JkZXINCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TWFyZ2luQm9yZGVyIj4NCisgICAgICAgICAgPGluc2V0cw0KKyAgICAgICAgICAgICAgdG9wPSI1Ig0KKyAgICAgICAgICAgICAgbGVmdD0iNSINCisgICAgICAgICAgICAgIGJvdHRvbT0iNSINCisgICAgICAgICAgICAgIHJpZ2h0PSI1Ii8+DQorICAgICAgICA8L2JvcmRlcj4NCisgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCINCisgICAgICAgICAgICBuYW1lPSJTZXF1ZW50aWFsVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIHRleHQ9IlNlcXVlbnRpYWxVbml0Ij4NCisgICAgICAgICAgPG1heGltdW1TaXplDQorICAgICAgICAgICAgICBkeD0iMTAwMDAiDQorICAgICAgICAgICAgICBkeT0iNTAiLz4NCisgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIg0KKyAgICAgICAgICAgIG5hbWU9IlNlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgICBvdXRsaW5lPSJmYWxzZSIvPg0KKyAgICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSINCisgICAgICAgICAgICBuYW1lPSJTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgICBvdXRsaW5lPSJmYWxzZSIvPg0KKyAgICAgIDwvYWN0dWFsRmlndXJlPg0KKyAgICAgIDxhY2Nlc3NvcnMNCisgICAgICAgICAgYWNjZXNzb3I9ImdldEZpZ3VyZVNlcXVlbnRpYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4xL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4NCisgICAgICA8YWNjZXNzb3JzDQorICAgICAgICAgIGFjY2Vzc29yPSJnZXRTZXF1ZW50aWFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4xL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjEiLz4NCisgICAgICA8YWNjZXNzb3JzDQorICAgICAgICAgIGFjY2Vzc29yPSJnZXRTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjEvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMiIvPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9IkNvbmRpdGlvbkNoZWNrRmlndXJlIj4NCisgICAgICA8YWN0dWFsRmlndXJlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSb3VuZGVkUmVjdGFuZ2xlIg0KKyAgICAgICAgICBuYW1lPSJDb25kaXRpb25DaGVja0ZpZ3VyZSI+DQorICAgICAgICA8Ym9yZGVyDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciI+DQorICAgICAgICAgIDxpbnNldHMNCisgICAgICAgICAgICAgIHRvcD0iNSINCisgICAgICAgICAgICAgIGxlZnQ9IjUiDQorICAgICAgICAgICAgICBib3R0b209IjUiDQorICAgICAgICAgICAgICByaWdodD0iNSIvPg0KKyAgICAgICAgPC9ib3JkZXI+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgICAgbmFtZT0iQ29uZGl0aW9uQ2hlY2tMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICB0ZXh0PSJDb25kaXRpb25DaGVjayIvPg0KKyAgICAgIDwvYWN0dWFsRmlndXJlPg0KKyAgICAgIDxhY2Nlc3NvcnMNCisgICAgICAgICAgYWNjZXNzb3I9ImdldEZpZ3VyZUNvbmRpdGlvbkNoZWNrTGFiZWxGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4yL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJDb25kaXRpb25hbFVuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9IkNvbmRpdGlvbmFsVW5pdEZpZ3VyZSI+DQorICAgICAgICA8Ym9yZGVyDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciI+DQorICAgICAgICAgIDxpbnNldHMNCisgICAgICAgICAgICAgIHRvcD0iNSINCisgICAgICAgICAgICAgIGxlZnQ9IjUiDQorICAgICAgICAgICAgICBib3R0b209IjUiDQorICAgICAgICAgICAgICByaWdodD0iNSIvPg0KKyAgICAgICAgPC9ib3JkZXI+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgICAgbmFtZT0iQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgdGV4dD0iQ29uZGl0aW9uYWxVbml0Ij4NCisgICAgICAgICAgPG1heGltdW1TaXplDQorICAgICAgICAgICAgICBkeD0iMTAwMDAiDQorICAgICAgICAgICAgICBkeT0iNTAiLz4NCisgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIg0KKyAgICAgICAgICAgIG5hbWU9IkNvbmRpdGlvbmFsVW5pdElmQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgICAgb3V0bGluZT0iZmFsc2UiLz4NCisgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiDQorICAgICAgICAgICAgbmFtZT0iQ29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgICBvdXRsaW5lPSJmYWxzZSIvPg0KKyAgICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSINCisgICAgICAgICAgICBuYW1lPSJDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgICAgb3V0bGluZT0iZmFsc2UiLz4NCisgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiDQorICAgICAgICAgICAgbmFtZT0iQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICAgIG91dGxpbmU9ImZhbHNlIi8+DQorICAgICAgPC9hY3R1YWxGaWd1cmU+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0RmlndXJlQ29uZGl0aW9uYWxVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4zL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4NCisgICAgICA8YWNjZXNzb3JzDQorICAgICAgICAgIGFjY2Vzc29yPSJnZXRDb25kaXRpb25hbFVuaXRJZkNvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMy9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4xIi8+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0Q29uZGl0aW9uYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjMvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMiIvPg0KKyAgICAgIDxhY2Nlc3NvcnMNCisgICAgICAgICAgYWNjZXNzb3I9ImdldENvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjMvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMyIvPg0KKyAgICAgIDxhY2Nlc3NvcnMNCisgICAgICAgICAgYWNjZXNzb3I9ImdldENvbmRpdGlvbmFsVW5pdEVsc2VDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjMvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uNCIvPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9IlNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9IlNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUiPg0KKyAgICAgICAgPGJvcmRlcg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpNYXJnaW5Cb3JkZXIiPg0KKyAgICAgICAgICA8aW5zZXRzDQorICAgICAgICAgICAgICB0b3A9IjUiDQorICAgICAgICAgICAgICBsZWZ0PSI1Ig0KKyAgICAgICAgICAgICAgYm90dG9tPSI1Ig0KKyAgICAgICAgICAgICAgcmlnaHQ9IjUiLz4NCisgICAgICAgIDwvYm9yZGVyPg0KKyAgICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIg0KKyAgICAgICAgICAgIG5hbWU9IlNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICB0ZXh0PSJTaW5nbGVRdWV1ZWRVbml0Ij4NCisgICAgICAgICAgPG1heGltdW1TaXplDQorICAgICAgICAgICAgICBkeD0iMTAwMDAiDQorICAgICAgICAgICAgICBkeT0iNTAiLz4NCisgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIg0KKyAgICAgICAgICAgIG5hbWU9IlNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICAgIG91dGxpbmU9ImZhbHNlIi8+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIg0KKyAgICAgICAgICAgIG5hbWU9IlNpbmdsZVF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRDb21wYXJ0bWVudEZpZ3VyZSINCisgICAgICAgICAgICBvdXRsaW5lPSJmYWxzZSIvPg0KKyAgICAgIDwvYWN0dWFsRmlndXJlPg0KKyAgICAgIDxhY2Nlc3NvcnMNCisgICAgICAgICAgYWNjZXNzb3I9ImdldEZpZ3VyZVNpbmdsZVF1ZXVlZFVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjQvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCIvPg0KKyAgICAgIDxhY2Nlc3NvcnMNCisgICAgICAgICAgYWNjZXNzb3I9ImdldFNpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNC9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4xIi8+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0U2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNC9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4yIi8+DQorICAgIDwvZGVzY3JpcHRvcnM+DQorICAgIDxkZXNjcmlwdG9ycw0KKyAgICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSI+DQorICAgICAgPGFjdHVhbEZpZ3VyZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Um91bmRlZFJlY3RhbmdsZSINCisgICAgICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSI+DQorICAgICAgICA8Ym9yZGVyDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciI+DQorICAgICAgICAgIDxpbnNldHMNCisgICAgICAgICAgICAgIHRvcD0iNSINCisgICAgICAgICAgICAgIGxlZnQ9IjUiDQorICAgICAgICAgICAgICBib3R0b209IjUiDQorICAgICAgICAgICAgICByaWdodD0iNSIvPg0KKyAgICAgICAgPC9ib3JkZXI+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIHRleHQ9IkNhcnRlc2lhblF1ZXVlZFVuaXQiPg0KKyAgICAgICAgICA8bWF4aW11bVNpemUNCisgICAgICAgICAgICAgIGR4PSIxMDAwMCINCisgICAgICAgICAgICAgIGR5PSI1MCIvPg0KKyAgICAgICAgPC9jaGlsZHJlbj4NCisgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiDQorICAgICAgICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgICAgb3V0bGluZT0iZmFsc2UiLz4NCisgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiDQorICAgICAgICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICAgIG91dGxpbmU9ImZhbHNlIi8+DQorICAgICAgPC9hY3R1YWxGaWd1cmU+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0RmlndXJlQ2FydGVzaWFuUXVldWVkVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNS9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIi8+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0Q2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy41L0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjEiLz4NCisgICAgICA8YWNjZXNzb3JzDQorICAgICAgICAgIGFjY2Vzc29yPSJnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy41L0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjIiLz4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9IlBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSI+DQorICAgICAgICA8Ym9yZGVyDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciI+DQorICAgICAgICAgIDxpbnNldHMNCisgICAgICAgICAgICAgIHRvcD0iNSINCisgICAgICAgICAgICAgIGxlZnQ9IjUiDQorICAgICAgICAgICAgICBib3R0b209IjUiDQorICAgICAgICAgICAgICByaWdodD0iNSIvPg0KKyAgICAgICAgPC9ib3JkZXI+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgICAgbmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgdGV4dD0iUGFyYWxsZWxRdWV1ZWRVbml0Ij4NCisgICAgICAgICAgPG1heGltdW1TaXplDQorICAgICAgICAgICAgICBkeD0iMTAwMDAiDQorICAgICAgICAgICAgICBkeT0iNTAiLz4NCisgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIg0KKyAgICAgICAgICAgIG5hbWU9IlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnRGaWd1cmUiDQorICAgICAgICAgICAgb3V0bGluZT0iZmFsc2UiLz4NCisgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiDQorICAgICAgICAgICAgbmFtZT0iUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICAgIG91dGxpbmU9ImZhbHNlIi8+DQorICAgICAgPC9hY3R1YWxGaWd1cmU+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0RmlndXJlUGFyYWxsZWxRdWV1ZWRVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy42L0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4NCisgICAgICA8YWNjZXNzb3JzDQorICAgICAgICAgIGFjY2Vzc29yPSJnZXRQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNi9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4xIi8+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0UGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50RmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNi9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4yIi8+DQorICAgIDwvZGVzY3JpcHRvcnM+DQorICAgIDxkZXNjcmlwdG9ycw0KKyAgICAgICAgbmFtZT0iU2luZ2xlRmVhdHVyZVVuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9IlNpbmdsZUZlYXR1cmVVbml0RmlndXJlIj4NCisgICAgICAgIDxib3JkZXINCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TWFyZ2luQm9yZGVyIj4NCisgICAgICAgICAgPGluc2V0cw0KKyAgICAgICAgICAgICAgdG9wPSI1Ig0KKyAgICAgICAgICAgICAgbGVmdD0iNSINCisgICAgICAgICAgICAgIGJvdHRvbT0iNSINCisgICAgICAgICAgICAgIHJpZ2h0PSI1Ii8+DQorICAgICAgICA8L2JvcmRlcj4NCisgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCINCisgICAgICAgICAgICBuYW1lPSJTaW5nbGVGZWF0dXJlVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIHRleHQ9IlNpbmdsZUZlYXR1cmVVbml0Ii8+DQorICAgICAgPC9hY3R1YWxGaWd1cmU+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0RmlndXJlU2luZ2xlRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjcvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCIvPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9Ik11bHRpRmVhdHVyZVVuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9Ik11bHRpRmVhdHVyZVVuaXRGaWd1cmUiPg0KKyAgICAgICAgPGJvcmRlcg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpNYXJnaW5Cb3JkZXIiPg0KKyAgICAgICAgICA8aW5zZXRzDQorICAgICAgICAgICAgICB0b3A9IjUiDQorICAgICAgICAgICAgICBsZWZ0PSI1Ig0KKyAgICAgICAgICAgICAgYm90dG9tPSI1Ig0KKyAgICAgICAgICAgICAgcmlnaHQ9IjUiLz4NCisgICAgICAgIDwvYm9yZGVyPg0KKyAgICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIg0KKyAgICAgICAgICAgIG5hbWU9Ik11bHRpRmVhdHVyZVVuaXRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgICB0ZXh0PSJNdWx0aUZlYXR1cmVVbml0Ii8+DQorICAgICAgPC9hY3R1YWxGaWd1cmU+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0RmlndXJlTXVsdGlGZWF0dXJlVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICBmaWd1cmU9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuOC9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIi8+DQorICAgIDwvZGVzY3JpcHRvcnM+DQorICAgIDxkZXNjcmlwdG9ycw0KKyAgICAgICAgbmFtZT0iU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSI+DQorICAgICAgPGFjdHVhbEZpZ3VyZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Um91bmRlZFJlY3RhbmdsZSINCisgICAgICAgICAgbmFtZT0iU2luZ2xlRmlsdGVyVW5pdEZpZ3VyZSI+DQorICAgICAgICA8Ym9yZGVyDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciI+DQorICAgICAgICAgIDxpbnNldHMNCisgICAgICAgICAgICAgIHRvcD0iNSINCisgICAgICAgICAgICAgIGxlZnQ9IjUiDQorICAgICAgICAgICAgICBib3R0b209IjUiDQorICAgICAgICAgICAgICByaWdodD0iNSIvPg0KKyAgICAgICAgPC9ib3JkZXI+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgICAgbmFtZT0iU2luZ2xlRmlsdGVyVW5pdExhYmVsRmlndXJlIg0KKyAgICAgICAgICAgIHRleHQ9IlNpbmdsZUZpbHRlclVuaXQiLz4NCisgICAgICA8L2FjdHVhbEZpZ3VyZT4NCisgICAgICA8YWNjZXNzb3JzDQorICAgICAgICAgIGFjY2Vzc29yPSJnZXRGaWd1cmVTaW5nbGVGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy45L0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJNdWx0aUZpbHRlclVuaXRGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJvdW5kZWRSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9Ik11bHRpRmlsdGVyVW5pdEZpZ3VyZSI+DQorICAgICAgICA8Ym9yZGVyDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciI+DQorICAgICAgICAgIDxpbnNldHMNCisgICAgICAgICAgICAgIHRvcD0iNSINCisgICAgICAgICAgICAgIGxlZnQ9IjUiDQorICAgICAgICAgICAgICBib3R0b209IjUiDQorICAgICAgICAgICAgICByaWdodD0iNSIvPg0KKyAgICAgICAgPC9ib3JkZXI+DQorICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgICAgbmFtZT0iTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgICAgdGV4dD0iTXVsdGlGaWx0ZXJVbml0Ii8+DQorICAgICAgPC9hY3R1YWxGaWd1cmU+DQorICAgICAgPGFjY2Vzc29ycw0KKyAgICAgICAgICBhY2Nlc3Nvcj0iZ2V0RmlndXJlTXVsdGlGaWx0ZXJVbml0TGFiZWxGaWd1cmUiDQorICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4xMC9AYWN0dWFsRmlndXJlL0BjaGlsZHJlbi4wIi8+DQorICAgIDwvZGVzY3JpcHRvcnM+DQorICAgIDxkZXNjcmlwdG9ycw0KKyAgICAgICAgbmFtZT0iU2luZ2xlSW5wdXRQb3J0RmlndXJlIj4NCisgICAgICA8YWN0dWFsRmlndXJlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiDQorICAgICAgICAgIG5hbWU9IlNpbmdsZUlucHV0UG9ydEZpZ3VyZSI+DQorICAgICAgICA8cHJlZmVycmVkU2l6ZQ0KKyAgICAgICAgICAgIGR4PSIyMCINCisgICAgICAgICAgICBkeT0iMjAiLz4NCisgICAgICAgIDxib3JkZXINCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TWFyZ2luQm9yZGVyIj4NCisgICAgICAgICAgPGluc2V0cw0KKyAgICAgICAgICAgICAgdG9wPSI1Ig0KKyAgICAgICAgICAgICAgbGVmdD0iNSINCisgICAgICAgICAgICAgIGJvdHRvbT0iNSINCisgICAgICAgICAgICAgIHJpZ2h0PSI1Ii8+DQorICAgICAgICA8L2JvcmRlcj4NCisgICAgICA8L2FjdHVhbEZpZ3VyZT4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJTaW5nbGVJbnB1dFBvcnRMYWJlbEZpZ3VyZSI+DQorICAgICAgPGFjdHVhbEZpZ3VyZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgIG5hbWU9IlNpbmdsZUlucHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgICAgICB0ZXh0PSJTaW5nbGVJbnB1dFBvcnQiLz4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJNdWx0aUlucHV0UG9ydEZpZ3VyZSI+DQorICAgICAgPGFjdHVhbEZpZ3VyZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIg0KKyAgICAgICAgICBuYW1lPSJNdWx0aUlucHV0UG9ydEZpZ3VyZSINCisgICAgICAgICAgbGluZVdpZHRoPSIxMCI+DQorICAgICAgICA8Zm9yZWdyb3VuZENvbG9yDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIg0KKyAgICAgICAgICAgIHJlZD0iMjU1Ii8+DQorICAgICAgICA8cHJlZmVycmVkU2l6ZQ0KKyAgICAgICAgICAgIGR4PSIyMCINCisgICAgICAgICAgICBkeT0iMjAiLz4NCisgICAgICAgIDxib3JkZXINCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TWFyZ2luQm9yZGVyIj4NCisgICAgICAgICAgPGluc2V0cw0KKyAgICAgICAgICAgICAgdG9wPSI1Ig0KKyAgICAgICAgICAgICAgbGVmdD0iNSINCisgICAgICAgICAgICAgIGJvdHRvbT0iNSINCisgICAgICAgICAgICAgIHJpZ2h0PSI1Ii8+DQorICAgICAgICA8L2JvcmRlcj4NCisgICAgICA8L2FjdHVhbEZpZ3VyZT4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJNdWx0aUlucHV0UG9ydExhYmVsRmlndXJlIj4NCisgICAgICA8YWN0dWFsRmlndXJlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCINCisgICAgICAgICAgbmFtZT0iTXVsdGlJbnB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgdGV4dD0iTXVsdGlJbnB1dFBvcnQiLz4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJTaW5nbGVPdXRwdXRQb3J0RmlndXJlIj4NCisgICAgICA8YWN0dWFsRmlndXJlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpFbGxpcHNlIg0KKyAgICAgICAgICBuYW1lPSJTaW5nbGVPdXRwdXRQb3J0RmlndXJlIj4NCisgICAgICAgIDxwcmVmZXJyZWRTaXplDQorICAgICAgICAgICAgZHg9IjIwIg0KKyAgICAgICAgICAgIGR5PSIyMCIvPg0KKyAgICAgICAgPGJvcmRlcg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpNYXJnaW5Cb3JkZXIiPg0KKyAgICAgICAgICA8aW5zZXRzDQorICAgICAgICAgICAgICB0b3A9IjUiDQorICAgICAgICAgICAgICBsZWZ0PSI1Ig0KKyAgICAgICAgICAgICAgYm90dG9tPSI1Ig0KKyAgICAgICAgICAgICAgcmlnaHQ9IjUiLz4NCisgICAgICAgIDwvYm9yZGVyPg0KKyAgICAgIDwvYWN0dWFsRmlndXJlPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9IlNpbmdsZU91dHB1dFBvcnRMYWJlbEZpZ3VyZSI+DQorICAgICAgPGFjdHVhbEZpZ3VyZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiDQorICAgICAgICAgIG5hbWU9IlNpbmdsZU91dHB1dFBvcnRMYWJlbEZpZ3VyZSINCisgICAgICAgICAgdGV4dD0iU2luZ2xlT3V0cHV0UG9ydCIvPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9Ik11bHRpT3V0cHV0UG9ydEZpZ3VyZSI+DQorICAgICAgPGFjdHVhbEZpZ3VyZQ0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6RWxsaXBzZSINCisgICAgICAgICAgbmFtZT0iTXVsdGlPdXRwdXRQb3J0RmlndXJlIg0KKyAgICAgICAgICBsaW5lV2lkdGg9IjEwIj4NCisgICAgICAgIDxmb3JlZ3JvdW5kQ29sb3INCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiDQorICAgICAgICAgICAgcmVkPSIyNTUiLz4NCisgICAgICAgIDxwcmVmZXJyZWRTaXplDQorICAgICAgICAgICAgZHg9IjIwIg0KKyAgICAgICAgICAgIGR5PSIyMCIvPg0KKyAgICAgICAgPGJvcmRlcg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpNYXJnaW5Cb3JkZXIiPg0KKyAgICAgICAgICA8aW5zZXRzDQorICAgICAgICAgICAgICB0b3A9IjUiDQorICAgICAgICAgICAgICBsZWZ0PSI1Ig0KKyAgICAgICAgICAgICAgYm90dG9tPSI1Ig0KKyAgICAgICAgICAgICAgcmlnaHQ9IjUiLz4NCisgICAgICAgIDwvYm9yZGVyPg0KKyAgICAgIDwvYWN0dWFsRmlndXJlPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9Ik11bHRpT3V0cHV0UG9ydExhYmVsRmlndXJlIj4NCisgICAgICA8YWN0dWFsRmlndXJlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpMYWJlbCINCisgICAgICAgICAgbmFtZT0iTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgICAgIHRleHQ9Ik11bHRpT3V0cHV0UG9ydCIvPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9IlNpbmdsZVBvcnRNYXBwaW5nRmlndXJlIj4NCisgICAgICA8YWN0dWFsRmlndXJlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZUNvbm5lY3Rpb24iDQorICAgICAgICAgIG5hbWU9IlNpbmdsZVBvcnRNYXBwaW5nRmlndXJlIg0KKyAgICAgICAgICBsaW5lV2lkdGg9IjIiDQorICAgICAgICAgIGxpbmVLaW5kPSJMSU5FX0RPVCINCisgICAgICAgICAgdGFyZ2V0RGVjb3JhdGlvbj0iLy9AZmlndXJlcy4wL0BmaWd1cmVzLjAiLz4NCisgICAgPC9kZXNjcmlwdG9ycz4NCisgICAgPGRlc2NyaXB0b3JzDQorICAgICAgICBuYW1lPSJNdWx0aVBvcnRNYXBwaW5nRmlndXJlIj4NCisgICAgICA8YWN0dWFsRmlndXJlDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZUNvbm5lY3Rpb24iDQorICAgICAgICAgIG5hbWU9Ik11bHRpUG9ydE1hcHBpbmdGaWd1cmUiDQorICAgICAgICAgIGxpbmVXaWR0aD0iMiINCisgICAgICAgICAgbGluZUtpbmQ9IkxJTkVfRE9UIg0KKyAgICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSIvL0BmaWd1cmVzLjAvQGZpZ3VyZXMuMSIvPg0KKyAgICA8L2Rlc2NyaXB0b3JzPg0KKyAgICA8ZGVzY3JpcHRvcnMNCisgICAgICAgIG5hbWU9Ik11bHRpU2luZ2xlUG9ydE1hcHBpbmdGaWd1cmUiPg0KKyAgICAgIDxhY3R1YWxGaWd1cmUNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lQ29ubmVjdGlvbiINCisgICAgICAgICAgbmFtZT0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSINCisgICAgICAgICAgbGluZVdpZHRoPSIyIg0KKyAgICAgICAgICBsaW5lS2luZD0iTElORV9ET1QiDQorICAgICAgICAgIHRhcmdldERlY29yYXRpb249Ii8vQGZpZ3VyZXMuMC9AZmlndXJlcy4yIi8+DQorICAgIDwvZGVzY3JpcHRvcnM+DQorICA8L2ZpZ3VyZXM+DQorICA8bm9kZXMNCisgICAgICBuYW1lPSJBdG9taWNVbml0Ig0KKyAgICAgIGZpZ3VyZT0iQXRvbWljVW5pdEZpZ3VyZSIvPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iU2VxdWVudGlhbFVuaXQiDQorICAgICAgZmlndXJlPSJTZXF1ZW50aWFsVW5pdEZpZ3VyZSIvPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iQ29uZGl0aW9uQ2hlY2siDQorICAgICAgZmlndXJlPSJDb25kaXRpb25DaGVja0ZpZ3VyZSIvPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iQ29uZGl0aW9uYWxVbml0Ig0KKyAgICAgIGZpZ3VyZT0iQ29uZGl0aW9uYWxVbml0RmlndXJlIi8+DQorICA8bm9kZXMNCisgICAgICBuYW1lPSJTaW5nbGVRdWV1ZWRVbml0Ig0KKyAgICAgIGZpZ3VyZT0iU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSIvPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdCINCisgICAgICBmaWd1cmU9IkNhcnRlc2lhblF1ZXVlZFVuaXRGaWd1cmUiLz4NCisgIDxub2Rlcw0KKyAgICAgIG5hbWU9IlBhcmFsbGVsUXVldWVkVW5pdCINCisgICAgICBmaWd1cmU9IlBhcmFsbGVsUXVldWVkVW5pdEZpZ3VyZSIvPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iU2luZ2xlRmVhdHVyZVVuaXQiDQorICAgICAgZmlndXJlPSJTaW5nbGVGZWF0dXJlVW5pdEZpZ3VyZSIvPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iTXVsdGlGZWF0dXJlVW5pdCINCisgICAgICBmaWd1cmU9Ik11bHRpRmVhdHVyZVVuaXRGaWd1cmUiLz4NCisgIDxub2Rlcw0KKyAgICAgIG5hbWU9IlNpbmdsZUZpbHRlclVuaXQiDQorICAgICAgZmlndXJlPSJTaW5nbGVGaWx0ZXJVbml0RmlndXJlIi8+DQorICA8bm9kZXMNCisgICAgICBuYW1lPSJNdWx0aUZpbHRlclVuaXQiDQorICAgICAgZmlndXJlPSJNdWx0aUZpbHRlclVuaXRGaWd1cmUiLz4NCisgIDxub2Rlcw0KKyAgICAgIG5hbWU9IlNpbmdsZUlucHV0UG9ydCINCisgICAgICBmaWd1cmU9IlNpbmdsZUlucHV0UG9ydEZpZ3VyZSINCisgICAgICBhZmZpeGVkUGFyZW50U2lkZT0iTlNFVyI+DQorICAgIDxmYWNldHMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpEZWZhdWx0U2l6ZUZhY2V0Ij4NCisgICAgICA8ZGVmYXVsdFNpemUNCisgICAgICAgICAgZHg9IjIwIg0KKyAgICAgICAgICBkeT0iMjAiLz4NCisgICAgPC9mYWNldHM+DQorICA8L25vZGVzPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iTXVsdGlJbnB1dFBvcnQiDQorICAgICAgZmlndXJlPSJNdWx0aUlucHV0UG9ydEZpZ3VyZSINCisgICAgICBhZmZpeGVkUGFyZW50U2lkZT0iTlNFVyI+DQorICAgIDxmYWNldHMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpEZWZhdWx0U2l6ZUZhY2V0Ij4NCisgICAgICA8ZGVmYXVsdFNpemUNCisgICAgICAgICAgZHg9IjIwIg0KKyAgICAgICAgICBkeT0iMjAiLz4NCisgICAgPC9mYWNldHM+DQorICA8L25vZGVzPg0KKyAgPG5vZGVzDQorICAgICAgbmFtZT0iU2luZ2xlT3V0cHV0UG9ydCINCisgICAgICBmaWd1cmU9IlNpbmdsZU91dHB1dFBvcnRGaWd1cmUiDQorICAgICAgYWZmaXhlZFBhcmVudFNpZGU9Ik5TRVciPg0KKyAgICA8ZmFjZXRzDQorICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6RGVmYXVsdFNpemVGYWNldCI+DQorICAgICAgPGRlZmF1bHRTaXplDQorICAgICAgICAgIGR4PSIyMCINCisgICAgICAgICAgZHk9IjIwIi8+DQorICAgIDwvZmFjZXRzPg0KKyAgPC9ub2Rlcz4NCisgIDxub2Rlcw0KKyAgICAgIG5hbWU9Ik11bHRpT3V0cHV0UG9ydCINCisgICAgICBmaWd1cmU9Ik11bHRpT3V0cHV0UG9ydEZpZ3VyZSINCisgICAgICBhZmZpeGVkUGFyZW50U2lkZT0iTlNFVyI+DQorICAgIDxmYWNldHMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpEZWZhdWx0U2l6ZUZhY2V0Ij4NCisgICAgICA8ZGVmYXVsdFNpemUNCisgICAgICAgICAgZHg9IjIwIg0KKyAgICAgICAgICBkeT0iMjAiLz4NCisgICAgPC9mYWNldHM+DQorICA8L25vZGVzPg0KKyAgPGNvbm5lY3Rpb25zDQorICAgICAgbmFtZT0iU2luZ2xlUG9ydE1hcHBpbmciDQorICAgICAgZmlndXJlPSJTaW5nbGVQb3J0TWFwcGluZ0ZpZ3VyZSIvPg0KKyAgPGNvbm5lY3Rpb25zDQorICAgICAgbmFtZT0iTXVsdGlQb3J0TWFwcGluZyINCisgICAgICBmaWd1cmU9Ik11bHRpUG9ydE1hcHBpbmdGaWd1cmUiLz4NCisgIDxjb25uZWN0aW9ucw0KKyAgICAgIG5hbWU9Ik11bHRpU2luZ2xlUG9ydE1hcHBpbmciDQorICAgICAgZmlndXJlPSJNdWx0aVNpbmdsZVBvcnRNYXBwaW5nRmlndXJlIi8+DQorICA8Y29tcGFydG1lbnRzDQorICAgICAgbmFtZT0iU2VxdWVudGlhbFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ig0KKyAgICAgIGZpZ3VyZT0iU2VxdWVudGlhbFVuaXRGaWd1cmUiDQorICAgICAgY29sbGFwc2libGU9InRydWUiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMS9AYWNjZXNzb3JzLjEiLz4NCisgIDxjb21wYXJ0bWVudHMNCisgICAgICBuYW1lPSJTZXF1ZW50aWFsVW5pdFJlZmFjdG9yaW5nVW5pdHNDb21wYXJ0bWVudCINCisgICAgICBmaWd1cmU9IlNlcXVlbnRpYWxVbml0RmlndXJlIg0KKyAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIg0KKyAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjEvQGFjY2Vzc29ycy4yIi8+DQorICA8Y29tcGFydG1lbnRzDQorICAgICAgbmFtZT0iQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudCINCisgICAgICBmaWd1cmU9IkNvbmRpdGlvbmFsVW5pdEZpZ3VyZSINCisgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSINCisgICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4zL0BhY2Nlc3NvcnMuMSIvPg0KKyAgPGNvbXBhcnRtZW50cw0KKyAgICAgIG5hbWU9IkNvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgZmlndXJlPSJDb25kaXRpb25hbFVuaXRGaWd1cmUiDQorICAgICAgY29sbGFwc2libGU9InRydWUiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMy9AYWNjZXNzb3JzLjIiLz4NCisgIDxjb21wYXJ0bWVudHMNCisgICAgICBuYW1lPSJDb25kaXRpb25hbFVuaXRUaGVuQ29tcGFydG1lbnQiDQorICAgICAgZmlndXJlPSJDb25kaXRpb25hbFVuaXRGaWd1cmUiDQorICAgICAgY29sbGFwc2libGU9InRydWUiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMy9AYWNjZXNzb3JzLjMiLz4NCisgIDxjb21wYXJ0bWVudHMNCisgICAgICBuYW1lPSJDb25kaXRpb25hbFVuaXRFbHNlQ29tcGFydG1lbnQiDQorICAgICAgZmlndXJlPSJDb25kaXRpb25hbFVuaXRGaWd1cmUiDQorICAgICAgY29sbGFwc2libGU9InRydWUiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMy9AYWNjZXNzb3JzLjQiLz4NCisgIDxjb21wYXJ0bWVudHMNCisgICAgICBuYW1lPSJTaW5nbGVRdWV1ZWRVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCINCisgICAgICBmaWd1cmU9IlNpbmdsZVF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgY29sbGFwc2libGU9InRydWUiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNC9AYWNjZXNzb3JzLjEiLz4NCisgIDxjb21wYXJ0bWVudHMNCisgICAgICBuYW1lPSJTaW5nbGVRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQiDQorICAgICAgZmlndXJlPSJTaW5nbGVRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIg0KKyAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjQvQGFjY2Vzc29ycy4yIi8+DQorICA8Y29tcGFydG1lbnRzDQorICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgZmlndXJlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIg0KKyAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjUvQGFjY2Vzc29ycy4xIi8+DQorICA8Y29tcGFydG1lbnRzDQorICAgICAgbmFtZT0iQ2FydGVzaWFuUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Ig0KKyAgICAgIGZpZ3VyZT0iQ2FydGVzaWFuUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSINCisgICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy41L0BhY2Nlc3NvcnMuMiIvPg0KKyAgPGNvbXBhcnRtZW50cw0KKyAgICAgIG5hbWU9IlBhcmFsbGVsUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiDQorICAgICAgZmlndXJlPSJQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgY29sbGFwc2libGU9InRydWUiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNi9AYWNjZXNzb3JzLjEiLz4NCisgIDxjb21wYXJ0bWVudHMNCisgICAgICBuYW1lPSJQYXJhbGxlbFF1ZXVlZFVuaXRSZWZhY3RvcmluZ1VuaXRzQ29tcGFydG1lbnQiDQorICAgICAgZmlndXJlPSJQYXJhbGxlbFF1ZXVlZFVuaXRGaWd1cmUiDQorICAgICAgY29sbGFwc2libGU9InRydWUiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNi9AYWNjZXNzb3JzLjIiLz4NCisgIDxsYWJlbHMNCisgICAgICBuYW1lPSJBdG9taWNVbml0TGFiZWwiDQorICAgICAgZmlndXJlPSJBdG9taWNVbml0RmlndXJlIg0KKyAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSINCisgICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY2Nlc3NvcnMuMCIvPg0KKyAgPGxhYmVscw0KKyAgICAgIG5hbWU9IlNlcXVlbnRpYWxVbml0TGFiZWwiDQorICAgICAgZmlndXJlPSJTZXF1ZW50aWFsVW5pdEZpZ3VyZSINCisgICAgICBlbGVtZW50SWNvbj0iZmFsc2UiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMS9AYWNjZXNzb3JzLjAiLz4NCisgIDxsYWJlbHMNCisgICAgICBuYW1lPSJDb25kaXRpb25DaGVja0xhYmVsIg0KKyAgICAgIGZpZ3VyZT0iQ29uZGl0aW9uQ2hlY2tGaWd1cmUiDQorICAgICAgZWxlbWVudEljb249ImZhbHNlIg0KKyAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjIvQGFjY2Vzc29ycy4wIi8+DQorICA8bGFiZWxzDQorICAgICAgbmFtZT0iQ29uZGl0aW9uYWxVbml0TGFiZWwiDQorICAgICAgZmlndXJlPSJDb25kaXRpb25hbFVuaXRGaWd1cmUiDQorICAgICAgZWxlbWVudEljb249ImZhbHNlIg0KKyAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjMvQGFjY2Vzc29ycy4wIi8+DQorICA8bGFiZWxzDQorICAgICAgbmFtZT0iU2luZ2xlUXVldWVkVW5pdExhYmVsIg0KKyAgICAgIGZpZ3VyZT0iU2luZ2xlUXVldWVkVW5pdEZpZ3VyZSINCisgICAgICBlbGVtZW50SWNvbj0iZmFsc2UiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNC9AYWNjZXNzb3JzLjAiLz4NCisgIDxsYWJlbHMNCisgICAgICBuYW1lPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWwiDQorICAgICAgZmlndXJlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSINCisgICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy41L0BhY2Nlc3NvcnMuMCIvPg0KKyAgPGxhYmVscw0KKyAgICAgIG5hbWU9IlBhcmFsbGVsUXVldWVkVW5pdExhYmVsIg0KKyAgICAgIGZpZ3VyZT0iUGFyYWxsZWxRdWV1ZWRVbml0RmlndXJlIg0KKyAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSINCisgICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy42L0BhY2Nlc3NvcnMuMCIvPg0KKyAgPGxhYmVscw0KKyAgICAgIG5hbWU9IlNpbmdsZUZlYXR1cmVVbml0TGFiZWwiDQorICAgICAgZmlndXJlPSJTaW5nbGVGZWF0dXJlVW5pdEZpZ3VyZSINCisgICAgICBlbGVtZW50SWNvbj0iZmFsc2UiDQorICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuNy9AYWNjZXNzb3JzLjAiLz4NCisgIDxsYWJlbHMNCisgICAgICBuYW1lPSJNdWx0aUZlYXR1cmVVbml0TGFiZWwiDQorICAgICAgZmlndXJlPSJNdWx0aUZlYXR1cmVVbml0RmlndXJlIg0KKyAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSINCisgICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy44L0BhY2Nlc3NvcnMuMCIvPg0KKyAgPGxhYmVscw0KKyAgICAgIG5hbWU9IlNpbmdsZUZpbHRlclVuaXRMYWJlbCINCisgICAgICBmaWd1cmU9IlNpbmdsZUZpbHRlclVuaXRGaWd1cmUiDQorICAgICAgZWxlbWVudEljb249ImZhbHNlIg0KKyAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjkvQGFjY2Vzc29ycy4wIi8+DQorICA8bGFiZWxzDQorICAgICAgbmFtZT0iTXVsdGlGaWx0ZXJVbml0TGFiZWwiDQorICAgICAgZmlndXJlPSJNdWx0aUZpbHRlclVuaXRGaWd1cmUiDQorICAgICAgZWxlbWVudEljb249ImZhbHNlIg0KKyAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjEwL0BhY2Nlc3NvcnMuMCIvPg0KKyAgPGxhYmVscw0KKyAgICAgIG5hbWU9IlNpbmdsZUlucHV0UG9ydExhYmVsIg0KKyAgICAgIGZpZ3VyZT0iU2luZ2xlSW5wdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+DQorICA8bGFiZWxzDQorICAgICAgbmFtZT0iTXVsdGlJbnB1dFBvcnRMYWJlbCINCisgICAgICBmaWd1cmU9Ik11bHRpSW5wdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+DQorICA8bGFiZWxzDQorICAgICAgbmFtZT0iU2luZ2xlT3V0cHV0UG9ydExhYmVsIg0KKyAgICAgIGZpZ3VyZT0iU2luZ2xlT3V0cHV0UG9ydExhYmVsRmlndXJlIg0KKyAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPg0KKyAgPGxhYmVscw0KKyAgICAgIG5hbWU9Ik11bHRpT3V0cHV0UG9ydExhYmVsIg0KKyAgICAgIGZpZ3VyZT0iTXVsdGlPdXRwdXRQb3J0TGFiZWxGaWd1cmUiDQorICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+DQorPC9nbWZncmFwaDpDYW52YXM+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwuZ21mbWFwIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwuZ21mbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOGQ3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC5nbWZtYXAKQEAgLTAsMCArMSw5MzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQorPGdtZm1hcDpNYXBwaW5nIHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSINCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiDQorICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwOC9tYXBwaW5ncyINCisgICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+DQorICA8bm9kZXM+DQorICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL01vZGVsUmVmYWN0b3JpbmcvaW5wdXRQb3J0cyIvPg0KKyAgICA8b3duZWRDaGlsZD4NCisgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQNCisgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlSW5wdXRQb3J0Ii8+DQorICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIg0KKyAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgPGRpYWdyYW1MYWJlbA0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNTaW5nbGVJbnB1dFBvcnRMYWJlbCIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BvcnQvdHlwZSIvPg0KKyAgICAgIDwvbGFiZWxNYXBwaW5ncz4NCisgICAgICA8dG9vbA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjQvQHRvb2xzLjIiLz4NCisgICAgICA8ZGlhZ3JhbU5vZGUNCisgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI1NpbmdsZUlucHV0UG9ydCIvPg0KKyAgICA8L293bmVkQ2hpbGQ+DQorICA8L25vZGVzPg0KKyAgPG5vZGVzPg0KKyAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db21wb3NpdGVSZWZhY3RvcmluZy9tYWluUmVmYWN0b3JpbmdVbml0Ii8+DQorICAgIDxvd25lZENoaWxkDQorICAgICAgICByZWxhdGVkRGlhZ3JhbXM9Ii8vQGRpYWdyYW0iPg0KKyAgICAgIDxkb21haW5NZXRhRWxlbWVudA0KKyAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0Ii8+DQorICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIg0KKyAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgPGRpYWdyYW1MYWJlbA0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNDYXJ0ZXNpYW5RdWV1ZWRVbml0TGFiZWwiLz4NCisgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3R5cGUiLz4NCisgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NhcnRlc2lhblF1ZXVlZFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgPC9sYWJlbE1hcHBpbmdzPg0KKyAgICAgIDx0b29sDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPg0KKyAgICAgIDxkaWFncmFtTm9kZQ0KKyAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjQ2FydGVzaWFuUXVldWVkVW5pdCIvPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjAvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NhcnRlc2lhblF1ZXVlZFVuaXQvc2luZ2xlSW5wdXRQb3J0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ2FydGVzaWFuUXVldWVkVW5pdC9tdWx0aUlucHV0UG9ydHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ2FydGVzaWFuUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMCINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi41L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjEvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjYvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NhcnRlc2lhblF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNy9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ2FydGVzaWFuUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMSINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy4zL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMSINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMSINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMSINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy42L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9DYXJ0ZXNpYW5RdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgICBjaGlsZHJlbj0iLy9Abm9kZXMuMS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNCAvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0BjaGlsZHJlbi41IC8vQG5vZGVzLjEvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjYgLy9Abm9kZXMuMS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNyI+DQorICAgICAgICA8Y29tcGFydG1lbnQNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjQ2FydGVzaWFuUXVldWVkVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiLz4NCisgICAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0BjaGlsZHJlbi4yIC8vQG5vZGVzLjEvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjMgLy9Abm9kZXMuMS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uOCAvL0Bub2Rlcy4xL0Bvd25lZENoaWxkL0BjaGlsZHJlbi45IC8vQG5vZGVzLjEvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjEwIC8vQG5vZGVzLjEvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjExIj4NCisgICAgICAgIDxjb21wYXJ0bWVudA0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNDYXJ0ZXNpYW5RdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0Q29tcGFydG1lbnQiLz4NCisgICAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgPC9vd25lZENoaWxkPg0KKyAgPC9ub2Rlcz4NCisgIDxub2Rlcz4NCisgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvbWFpblJlZmFjdG9yaW5nVW5pdCIvPg0KKyAgICA8b3duZWRDaGlsZA0KKyAgICAgICAgcmVsYXRlZERpYWdyYW1zPSIvL0BkaWFncmFtIj4NCisgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQNCisgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vUGFyYWxsZWxRdWV1ZWRVbml0Ii8+DQorICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIg0KKyAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgPGRpYWdyYW1MYWJlbA0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNQYXJhbGxlbFF1ZXVlZFVuaXRMYWJlbCIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC90eXBlIi8+DQorICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9QYXJhbGxlbFF1ZXVlZFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgPC9sYWJlbE1hcHBpbmdzPg0KKyAgICAgIDx0b29sDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMyIvPg0KKyAgICAgIDxkaWFncmFtTm9kZQ0KKyAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjUGFyYWxsZWxRdWV1ZWRVbml0Ii8+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vUGFyYWxsZWxRdWV1ZWRVbml0L3NpbmdsZUlucHV0UG9ydHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjEvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9tdWx0aUlucHV0UG9ydHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vUGFyYWxsZWxRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vUGFyYWxsZWxRdWV1ZWRVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vUGFyYWxsZWxRdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjIvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjUvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy4yL0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMCINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi42L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9QYXJhbGxlbFF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNy9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vUGFyYWxsZWxRdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjIvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjMvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjIvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjIvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjUvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjIvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjYvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BhcmFsbGVsUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy4yL0Bvd25lZENoaWxkL0BjaGlsZHJlbi40IC8vQG5vZGVzLjIvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjUgLy9Abm9kZXMuMi9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNiAvL0Bub2Rlcy4yL0Bvd25lZENoaWxkL0BjaGlsZHJlbi43Ij4NCisgICAgICAgIDxjb21wYXJ0bWVudA0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNQYXJhbGxlbFF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ii8+DQorICAgICAgPC9jb21wYXJ0bWVudHM+DQorICAgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgICBjaGlsZHJlbj0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMiAvL0Bub2Rlcy4yL0Bvd25lZENoaWxkL0BjaGlsZHJlbi4zIC8vQG5vZGVzLjIvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjggLy9Abm9kZXMuMi9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uOSAvL0Bub2Rlcy4yL0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xMCAvL0Bub2Rlcy4yL0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xMSI+DQorICAgICAgICA8Y29tcGFydG1lbnQNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjUGFyYWxsZWxRdWV1ZWRVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Ii8+DQorICAgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDwvb3duZWRDaGlsZD4NCisgIDwvbm9kZXM+DQorICA8bm9kZXM+DQorICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgPG93bmVkQ2hpbGQNCisgICAgICAgIHJlbGF0ZWREaWFncmFtcz0iLy9AZGlhZ3JhbSI+DQorICAgICAgPGRvbWFpbk1ldGFFbGVtZW50DQorICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQiLz4NCisgICAgICA8bGFiZWxNYXBwaW5ncw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciDQorICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSAtezJ9LSI+DQorICAgICAgICA8ZGlhZ3JhbUxhYmVsDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI1NpbmdsZVF1ZXVlZFVuaXRMYWJlbCIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvdHlwZSIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9sYmxTdHJpY3QiLz4NCisgICAgICA8L2xhYmVsTWFwcGluZ3M+DQorICAgICAgPHRvb2wNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy41Ii8+DQorICAgICAgPGRpYWdyYW1Ob2RlDQorICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNTaW5nbGVRdWV1ZWRVbml0Ii8+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9zaW5nbGVJbnB1dFBvcnRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVRdWV1ZWRVbml0L211bHRpSW5wdXRQb3J0Ii8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjMvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjEvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjMvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjIvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvcmVmYWN0b3JpbmdVbml0Ii8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjMvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjQvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy4zL0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMCINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi42L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVRdWV1ZWRVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjMvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjcvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZVF1ZXVlZFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNi9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUXVldWVkVW5pdC9yZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgICAgY2hpbGRyZW49Ii8vQG5vZGVzLjMvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjQgLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNSAvL0Bub2Rlcy4zL0Bvd25lZENoaWxkL0BjaGlsZHJlbi42IC8vQG5vZGVzLjMvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjciPg0KKyAgICAgICAgPGNvbXBhcnRtZW50DQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI1NpbmdsZVF1ZXVlZFVuaXRIZWxwZXJVbml0c0NvbXBhcnRtZW50Ii8+DQorICAgICAgPC9jb21wYXJ0bWVudHM+DQorICAgICAgPGNvbXBhcnRtZW50cw0KKyAgICAgICAgICBjaGlsZHJlbj0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMiAvL0Bub2Rlcy4zL0Bvd25lZENoaWxkL0BjaGlsZHJlbi4zIC8vQG5vZGVzLjMvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjggLy9Abm9kZXMuMy9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uOSAvL0Bub2Rlcy4zL0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xMCAvL0Bub2Rlcy4zL0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xMSI+DQorICAgICAgICA8Y29tcGFydG1lbnQNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjU2luZ2xlUXVldWVkVW5pdFJlZmFjdG9yaW5nVW5pdENvbXBhcnRtZW50Ii8+DQorICAgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDwvb3duZWRDaGlsZD4NCisgIDwvbm9kZXM+DQorICA8bm9kZXM+DQorICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgPG93bmVkQ2hpbGQNCisgICAgICAgIHJlbGF0ZWREaWFncmFtcz0iLy9AZGlhZ3JhbSI+DQorICAgICAgPGRvbWFpbk1ldGFFbGVtZW50DQorICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NlcXVlbnRpYWxVbml0Ii8+DQorICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIg0KKyAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0gLXsyfS0iPg0KKyAgICAgICAgPGRpYWdyYW1MYWJlbA0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNTZXF1ZW50aWFsVW5pdExhYmVsIi8+DQorICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvdHlwZSIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvbGJsU3RyaWN0Ii8+DQorICAgICAgPC9sYWJlbE1hcHBpbmdzPg0KKyAgICAgIDx0b29sDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuNCIvPg0KKyAgICAgIDxkaWFncmFtTm9kZQ0KKyAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjU2VxdWVudGlhbFVuaXQiLz4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy4wL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TZXF1ZW50aWFsVW5pdC9pbnB1dFBvcnRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvaW5wdXRQb3J0cyIvPg0KKyAgICAgICAgPG93bmVkQ2hpbGQ+DQorICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudA0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTXVsdGlJbnB1dFBvcnQiLz4NCisgICAgICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyINCisgICAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNNdWx0aUlucHV0UG9ydExhYmVsIi8+DQorICAgICAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+DQorICAgICAgICAgIDx0b29sDQorICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy40L0B0b29scy4wIi8+DQorICAgICAgICAgIDxkaWFncmFtTm9kZQ0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI011bHRpSW5wdXRQb3J0Ii8+DQorICAgICAgICA8L293bmVkQ2hpbGQ+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjEvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NlcXVlbnRpYWxVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMi9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxvd25lZENoaWxkPg0KKyAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUZlYXR1cmVVbml0Ii8+DQorICAgICAgICAgIDxsYWJlbE1hcHBpbmdzDQorICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciDQorICAgICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgICAgPGRpYWdyYW1MYWJlbA0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjU2luZ2xlRmVhdHVyZVVuaXRMYWJlbCIvPg0KKyAgICAgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVGZWF0dXJlVW5pdC90eXBlIi8+DQorICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4NCisgICAgICAgICAgPHRvb2wNCisgICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjMvQHRvb2xzLjEiLz4NCisgICAgICAgICAgPGRpYWdyYW1Ob2RlDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjU2luZ2xlRmVhdHVyZVVuaXQiLz4NCisgICAgICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjAvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlRmVhdHVyZVVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xL0Bvd25lZENoaWxkIj4NCisgICAgICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUZlYXR1cmVVbml0L3NlY29uZGFyeUlucHV0UG9ydHMiLz4NCisgICAgICAgICAgPC9jaGlsZHJlbj4NCisgICAgICAgICAgPGNoaWxkcmVuPg0KKyAgICAgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlRmVhdHVyZVVuaXQvb3V0cHV0UG9ydCIvPg0KKyAgICAgICAgICAgIDxvd25lZENoaWxkPg0KKyAgICAgICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50DQorICAgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlT3V0cHV0UG9ydCIvPg0KKyAgICAgICAgICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciDQorICAgICAgICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgICAgICAgIDxkaWFncmFtTGFiZWwNCisgICAgICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNTaW5nbGVPdXRwdXRQb3J0TGFiZWwiLz4NCisgICAgICAgICAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1BvcnQvdHlwZSIvPg0KKyAgICAgICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPg0KKyAgICAgICAgICAgICAgPHRvb2wNCisgICAgICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuNC9AdG9vbHMuMyIvPg0KKyAgICAgICAgICAgICAgPGRpYWdyYW1Ob2RlDQorICAgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI1NpbmdsZU91dHB1dFBvcnQiLz4NCisgICAgICAgICAgICA8L293bmVkQ2hpbGQ+DQorICAgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICA8L293bmVkQ2hpbGQ+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TZXF1ZW50aWFsVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgICAgPG93bmVkQ2hpbGQ+DQorICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudA0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTXVsdGlGZWF0dXJlVW5pdCIvPg0KKyAgICAgICAgICA8bGFiZWxNYXBwaW5ncw0KKyAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIg0KKyAgICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgICAgZWRpdFBhdHRlcm49InswfTp7MX0iPg0KKyAgICAgICAgICAgIDxkaWFncmFtTGFiZWwNCisgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI011bHRpRmVhdHVyZVVuaXRMYWJlbCIvPg0KKyAgICAgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9NdWx0aUZlYXR1cmVVbml0L3R5cGUiLz4NCisgICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPg0KKyAgICAgICAgICA8dG9vbA0KKyAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMy9AdG9vbHMuMCIvPg0KKyAgICAgICAgICA8ZGlhZ3JhbU5vZGUNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNNdWx0aUZlYXR1cmVVbml0Ii8+DQorICAgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy4wL0Bvd25lZENoaWxkIj4NCisgICAgICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpRmVhdHVyZVVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xL0Bvd25lZENoaWxkIj4NCisgICAgICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpRmVhdHVyZVVuaXQvc2Vjb25kYXJ5SW5wdXRQb3J0cyIvPg0KKyAgICAgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgICAgICA8Y2hpbGRyZW4+DQorICAgICAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9NdWx0aUZlYXR1cmVVbml0L291dHB1dFBvcnQiLz4NCisgICAgICAgICAgICA8b3duZWRDaGlsZD4NCisgICAgICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudA0KKyAgICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpT3V0cHV0UG9ydCIvPg0KKyAgICAgICAgICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciDQorICAgICAgICAgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICAgICAgICAgIDxkaWFncmFtTGFiZWwNCisgICAgICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNNdWx0aU91dHB1dFBvcnRMYWJlbCIvPg0KKyAgICAgICAgICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vUG9ydC90eXBlIi8+DQorICAgICAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+DQorICAgICAgICAgICAgICA8dG9vbA0KKyAgICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy40L0B0b29scy4xIi8+DQorICAgICAgICAgICAgICA8ZGlhZ3JhbU5vZGUNCisgICAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjTXVsdGlPdXRwdXRQb3J0Ii8+DQorICAgICAgICAgICAgPC9vd25lZENoaWxkPg0KKyAgICAgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgICAgPC9vd25lZENoaWxkPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICAgIDxvd25lZENoaWxkPg0KKyAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQNCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NpbmdsZUZpbHRlclVuaXQiLz4NCisgICAgICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyINCisgICAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNTaW5nbGVGaWx0ZXJVbml0TGFiZWwiLz4NCisgICAgICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4NCisgICAgICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlRmlsdGVyVW5pdC90eXBlIi8+DQorICAgICAgICAgIDwvbGFiZWxNYXBwaW5ncz4NCisgICAgICAgICAgPHRvb2wNCisgICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjIvQHRvb2xzLjEiLz4NCisgICAgICAgICAgPGRpYWdyYW1Ob2RlDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjU2luZ2xlRmlsdGVyVW5pdCIvPg0KKyAgICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMS9Ab3duZWRDaGlsZCI+DQorICAgICAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVGaWx0ZXJVbml0L2lucHV0UG9ydCIvPg0KKyAgICAgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMi9Ab3duZWRDaGlsZCI+DQorICAgICAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVGaWx0ZXJVbml0L291dHB1dFBvcnQiLz4NCisgICAgICAgICAgPC9jaGlsZHJlbj4NCisgICAgICAgIDwvb3duZWRDaGlsZD4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NlcXVlbnRpYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgICA8b3duZWRDaGlsZD4NCisgICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50DQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9NdWx0aUZpbHRlclVuaXQiLz4NCisgICAgICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyINCisgICAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSINCisgICAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNNdWx0aUZpbHRlclVuaXRMYWJlbCIvPg0KKyAgICAgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPg0KKyAgICAgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9NdWx0aUZpbHRlclVuaXQvdHlwZSIvPg0KKyAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+DQorICAgICAgICAgIDx0b29sDQorICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4yL0B0b29scy4wIi8+DQorICAgICAgICAgIDxkaWFncmFtTm9kZQ0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI011bHRpRmlsdGVyVW5pdCIvPg0KKyAgICAgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMS9Ab3duZWRDaGlsZCI+DQorICAgICAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9NdWx0aUZpbHRlclVuaXQvaW5wdXRQb3J0Ii8+DQorICAgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4yL0Bvd25lZENoaWxkIj4NCisgICAgICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpRmlsdGVyVW5pdC9vdXRwdXRQb3J0Ii8+DQorICAgICAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgICA8L293bmVkQ2hpbGQ+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjMvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NlcXVlbnRpYWxVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2VxdWVudGlhbFVuaXQvcmVmYWN0b3JpbmdVbml0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMSINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TZXF1ZW50aWFsVW5pdC9yZWZhY3RvcmluZ1VuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjYvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL1NlcXVlbnRpYWxVbml0L3JlZmFjdG9yaW5nVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgICAgY2hpbGRyZW49Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjQgLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNSAvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi42IC8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjciPg0KKyAgICAgICAgPGNvbXBhcnRtZW50DQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI1NlcXVlbnRpYWxVbml0SGVscGVyVW5pdHNDb21wYXJ0bWVudCIvPg0KKyAgICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgICAgY2hpbGRyZW49Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjIgLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMyAvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi44IC8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjkgLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMTAgLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMTEiPg0KKyAgICAgICAgPGNvbXBhcnRtZW50DQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI1NlcXVlbnRpYWxVbml0UmVmYWN0b3JpbmdVbml0c0NvbXBhcnRtZW50Ii8+DQorICAgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDwvb3duZWRDaGlsZD4NCisgIDwvbm9kZXM+DQorICA8bm9kZXM+DQorICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgPG93bmVkQ2hpbGQNCisgICAgICAgIHJlbGF0ZWREaWFncmFtcz0iLy9AZGlhZ3JhbSI+DQorICAgICAgPGRvbWFpbk1ldGFFbGVtZW50DQorICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgIDxsYWJlbE1hcHBpbmdzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyINCisgICAgICAgICAgdmlld1BhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgIGVkaXRvclBhdHRlcm49InswfTp7MX0iDQorICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9Ij4NCisgICAgICAgIDxkaWFncmFtTGFiZWwNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjQ29uZGl0aW9uYWxVbml0TGFiZWwiLz4NCisgICAgICAgIDxmZWF0dXJlcw0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvdHlwZSIvPg0KKyAgICAgIDwvbGFiZWxNYXBwaW5ncz4NCisgICAgICA8dG9vbA0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjIiLz4NCisgICAgICA8ZGlhZ3JhbU5vZGUNCisgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI0NvbmRpdGlvbmFsVW5pdCIvPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjAvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdC9pbnB1dFBvcnRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvaW5wdXRQb3J0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMiINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvdGhlbiIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMiINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy4yL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvdGhlbiIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMyINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy4xL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvZWxzZSIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMyINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy4yL0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvZWxzZSIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMSINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi40L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjEiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L2hlbHBlclVuaXRzIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjUvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4xIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjQvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjYvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdC9oZWxwZXJVbml0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgICAgPGNoaWxkcmVuDQorICAgICAgICAgIGNvbXBhcnRtZW50PSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0Bjb21wYXJ0bWVudHMuMSINCisgICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy40L0Bvd25lZENoaWxkL0BjaGlsZHJlbi43L0Bvd25lZENoaWxkIj4NCisgICAgICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db25kaXRpb25hbFVuaXQvaGVscGVyVW5pdHMiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjIiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjMiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuMy9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjIiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjIiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L3RoZW4iLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjMiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNC9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjMiDQorICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZCI+DQorICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uYWxVbml0L2Vsc2UiLz4NCisgICAgICA8L2NoaWxkcmVuPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdC9pZiIvPg0KKyAgICAgICAgPG93bmVkQ2hpbGQ+DQorICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudA0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uQ2hlY2siLz4NCisgICAgICAgICAgPGxhYmVsTWFwcGluZ3MNCisgICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyINCisgICAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIg0KKyAgICAgICAgICAgICAgZWRpdG9yUGF0dGVybj0iezB9OnsxfSAtezJ9LSINCisgICAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSJ7MH06ezF9IC17Mn0tIj4NCisgICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5nbWZncmFwaCNDb25kaXRpb25DaGVja0xhYmVsIi8+DQorICAgICAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+DQorICAgICAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbkNoZWNrL3R5cGUiLz4NCisgICAgICAgICAgICA8ZmVhdHVyZXMNCisgICAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29uZGl0aW9uQ2hlY2svc3BlYyIvPg0KKyAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+DQorICAgICAgICAgIDx0b29sDQorICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4xIi8+DQorICAgICAgICAgIDxkaWFncmFtTm9kZQ0KKyAgICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI0NvbmRpdGlvbkNoZWNrIi8+DQorICAgICAgICA8L293bmVkQ2hpbGQ+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjUvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4yIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjYvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdC90aGVuIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y2hpbGRyZW4NCisgICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjUvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4zIg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjYvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbmRpdGlvbmFsVW5pdC9lbHNlIi8+DQorICAgICAgPC9jaGlsZHJlbj4NCisgICAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xNiI+DQorICAgICAgICA8Y29tcGFydG1lbnQNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjQ29uZGl0aW9uYWxVbml0SWZDb21wYXJ0bWVudCIvPg0KKyAgICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgICAgY2hpbGRyZW49Ii8vQG5vZGVzLjUvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjYgLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNyAvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi44IC8vQG5vZGVzLjUvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjkiPg0KKyAgICAgICAgPGNvbXBhcnRtZW50DQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI0NvbmRpdGlvbmFsVW5pdEhlbHBlclVuaXRzQ29tcGFydG1lbnQiLz4NCisgICAgICA8L2NvbXBhcnRtZW50cz4NCisgICAgICA8Y29tcGFydG1lbnRzDQorICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4yIC8vQG5vZGVzLjUvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjMgLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMTAgLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMTIgLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMTMgLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMTciPg0KKyAgICAgICAgPGNvbXBhcnRtZW50DQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI0NvbmRpdGlvbmFsVW5pdFRoZW5Db21wYXJ0bWVudCIvPg0KKyAgICAgIDwvY29tcGFydG1lbnRzPg0KKyAgICAgIDxjb21wYXJ0bWVudHMNCisgICAgICAgICAgY2hpbGRyZW49Ii8vQG5vZGVzLjUvQG93bmVkQ2hpbGQvQGNoaWxkcmVuLjQgLy9Abm9kZXMuNS9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uNSAvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xMSAvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xNCAvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xNSAvL0Bub2Rlcy41L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4xOCI+DQorICAgICAgICA8Y29tcGFydG1lbnQNCisgICAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjQ29uZGl0aW9uYWxVbml0RWxzZUNvbXBhcnRtZW50Ii8+DQorICAgICAgPC9jb21wYXJ0bWVudHM+DQorICAgIDwvb3duZWRDaGlsZD4NCisgIDwvbm9kZXM+DQorICA8bm9kZXM+DQorICAgIDxjb250YWlubWVudEZlYXR1cmUNCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0NvbXBvc2l0ZVJlZmFjdG9yaW5nL21haW5SZWZhY3RvcmluZ1VuaXQiLz4NCisgICAgPG93bmVkQ2hpbGQ+DQorICAgICAgPGRvbWFpbk1ldGFFbGVtZW50DQorICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0F0b21pY1VuaXQiLz4NCisgICAgICA8bGFiZWxNYXBwaW5ncw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciDQorICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICBlZGl0b3JQYXR0ZXJuPSJ7MH06ezF9Ig0KKyAgICAgICAgICBlZGl0UGF0dGVybj0iezB9OnsxfSI+DQorICAgICAgICA8ZGlhZ3JhbUxhYmVsDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI0F0b21pY1VuaXRMYWJlbCIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQXRvbWljVW5pdC9sYWJlbCIvPg0KKyAgICAgICAgPGZlYXR1cmVzDQorICAgICAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQXRvbWljVW5pdC90eXBlIi8+DQorICAgICAgPC9sYWJlbE1hcHBpbmdzPg0KKyAgICAgIDx0b29sDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgaHJlZj0iY29tcmVsLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMCIvPg0KKyAgICAgIDxkaWFncmFtTm9kZQ0KKyAgICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjQXRvbWljVW5pdCIvPg0KKyAgICAgIDxjaGlsZHJlbg0KKyAgICAgICAgICByZWZlcmVuY2VkQ2hpbGQ9Ii8vQG5vZGVzLjAvQG93bmVkQ2hpbGQiPg0KKyAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL0F0b21pY1VuaXQvaW5wdXRQb3J0cyIvPg0KKyAgICAgIDwvY2hpbGRyZW4+DQorICAgIDwvb3duZWRDaGlsZD4NCisgIDwvbm9kZXM+DQorICA8bGlua3M+DQorICAgIDxkb21haW5NZXRhRWxlbWVudA0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vU2luZ2xlUG9ydE1hcHBpbmciLz4NCisgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvcG9ydE1hcHBpbmdzIi8+DQorICAgIDx0b29sDQorICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy41L0B0b29scy4yIi8+DQorICAgIDxkaWFncmFtTGluaw0KKyAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI1NpbmdsZVBvcnRNYXBwaW5nIi8+DQorICAgIDxzb3VyY2VNZXRhRmVhdHVyZQ0KKyAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiDQorICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVQb3J0TWFwcGluZy9zb3VyY2UiLz4NCisgICAgPGxpbmtNZXRhRmVhdHVyZQ0KKyAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiDQorICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9TaW5nbGVQb3J0TWFwcGluZy90YXJnZXQiLz4NCisgICAgPGNyZWF0aW9uQ29uc3RyYWludHM+DQorICAgICAgPHNvdXJjZUVuZA0KKyAgICAgICAgICBib2R5PSJzZWxmJmx0Oz5vcHBvc2l0ZUVuZCIvPg0KKyAgICA8L2NyZWF0aW9uQ29uc3RyYWludHM+DQorICA8L2xpbmtzPg0KKyAgPGxpbmtzPg0KKyAgICA8ZG9tYWluTWV0YUVsZW1lbnQNCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpUG9ydE1hcHBpbmciLz4NCisgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvcG9ydE1hcHBpbmdzIi8+DQorICAgIDx0b29sDQorICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy41L0B0b29scy4wIi8+DQorICAgIDxkaWFncmFtTGluaw0KKyAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI011bHRpUG9ydE1hcHBpbmciLz4NCisgICAgPHNvdXJjZU1ldGFGZWF0dXJlDQorICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSINCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpUG9ydE1hcHBpbmcvc291cmNlIi8+DQorICAgIDxsaW5rTWV0YUZlYXR1cmUNCisgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIg0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTXVsdGlQb3J0TWFwcGluZy90YXJnZXQiLz4NCisgICAgPGNyZWF0aW9uQ29uc3RyYWludHM+DQorICAgICAgPHNvdXJjZUVuZA0KKyAgICAgICAgICBib2R5PSJzZWxmJmx0Oz5vcHBvc2l0ZUVuZCIvPg0KKyAgICA8L2NyZWF0aW9uQ29uc3RyYWludHM+DQorICA8L2xpbmtzPg0KKyAgPGxpbmtzPg0KKyAgICA8ZG9tYWluTWV0YUVsZW1lbnQNCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpU2luZ2xlUG9ydE1hcHBpbmciLz4NCisgICAgPGNvbnRhaW5tZW50RmVhdHVyZQ0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vQ29tcG9zaXRlUmVmYWN0b3JpbmcvcG9ydE1hcHBpbmdzIi8+DQorICAgIDx0b29sDQorICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICBocmVmPSJjb21yZWwuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy41L0B0b29scy4xIi8+DQorICAgIDxkaWFncmFtTGluaw0KKyAgICAgICAgaHJlZj0iY29tcmVsLmdtZmdyYXBoI011bHRpU2luZ2xlUG9ydE1hcHBpbmciLz4NCisgICAgPHNvdXJjZU1ldGFGZWF0dXJlDQorICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSINCisgICAgICAgIGhyZWY9ImNvbXJlbC5lY29yZSMvL011bHRpU2luZ2xlUG9ydE1hcHBpbmcvc291cmNlIi8+DQorICAgIDxsaW5rTWV0YUZlYXR1cmUNCisgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIg0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8vTXVsdGlTaW5nbGVQb3J0TWFwcGluZy90YXJnZXQiLz4NCisgICAgPGNyZWF0aW9uQ29uc3RyYWludHM+DQorICAgICAgPHNvdXJjZUVuZA0KKyAgICAgICAgICBib2R5PSJzZWxmJmx0Oz5vcHBvc2l0ZUVuZCIvPg0KKyAgICA8L2NyZWF0aW9uQ29uc3RyYWludHM+DQorICA8L2xpbmtzPg0KKyAgPGRpYWdyYW0+DQorICAgIDxkaWFncmFtQ2FudmFzDQorICAgICAgICBocmVmPSJjb21yZWwuZ21mZ3JhcGgjY29tcmVsIi8+DQorICAgIDxkb21haW5Nb2RlbA0KKyAgICAgICAgaHJlZj0iY29tcmVsLmVjb3JlIy8iLz4NCisgICAgPGRvbWFpbk1ldGFFbGVtZW50DQorICAgICAgICBocmVmPSJjb21yZWwuZWNvcmUjLy9Db21wb3NpdGVSZWZhY3RvcmluZyIvPg0KKyAgICA8cGFsZXR0ZQ0KKyAgICAgICAgaHJlZj0iY29tcmVsLmdtZnRvb2wjLy9AcGFsZXR0ZSIvPg0KKyAgPC9kaWFncmFtPg0KKzwvZ21mbWFwOk1hcHBpbmc+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwuZ21mdG9vbCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvbW9kZWwvY29tcmVsLmdtZnRvb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwZTI3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvbW9kZWwvY29tcmVsLmdtZnRvb2wKQEAgLTAsMCArMSwyMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQorPGdtZnRvb2w6VG9vbFJlZ2lzdHJ5IHhtaTp2ZXJzaW9uPSIyLjAiDQorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSINCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+DQorICA8cGFsZXR0ZQ0KKyAgICAgIHRpdGxlPSJjb21yZWxQYWxldHRlIj4NCisgICAgPHRvb2xzDQorICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiDQorICAgICAgICB0aXRsZT0iQ29tcG9zaXRlIFVuaXRzIg0KKyAgICAgICAgY29sbGFwc2libGU9InRydWUiPg0KKyAgICAgIDx0b29scw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgIHRpdGxlPSJDYXJ0ZXNpYW5RdWV1ZWRVbml0Ig0KKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0Ij4NCisgICAgICAgIDxzbWFsbEljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICAgIDxsYXJnZUljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICA8L3Rvb2xzPg0KKyAgICAgIDx0b29scw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgIHRpdGxlPSJDb25kaXRpb25DaGVjayINCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29uZGl0aW9uQ2hlY2siPg0KKyAgICAgICAgPHNtYWxsSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgICAgPGxhcmdlSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgIDwvdG9vbHM+DQorICAgICAgPHRvb2xzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgdGl0bGU9IkNvbmRpdGlvbmFsVW5pdCINCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29uZGl0aW9uYWxVbml0Ij4NCisgICAgICAgIDxzbWFsbEljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICAgIDxsYXJnZUljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICA8L3Rvb2xzPg0KKyAgICAgIDx0b29scw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgIHRpdGxlPSJQYXJhbGxlbFF1ZXVlZFVuaXQiDQorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFBhcmFsbGVsUXVldWVkVW5pdCI+DQorICAgICAgICA8c21hbGxJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgICA8bGFyZ2VJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgPC90b29scz4NCisgICAgICA8dG9vbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICB0aXRsZT0iU2VxdWVudGlhbFVuaXQiDQorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFNlcXVlbnRpYWxVbml0Ij4NCisgICAgICAgIDxzbWFsbEljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICAgIDxsYXJnZUljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICA8L3Rvb2xzPg0KKyAgICAgIDx0b29scw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgIHRpdGxlPSJTaW5nbGVRdWV1ZWRVbml0Ig0KKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTaW5nbGVRdWV1ZWRVbml0Ij4NCisgICAgICAgIDxzbWFsbEljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICAgIDxsYXJnZUljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICA8L3Rvb2xzPg0KKyAgICA8L3Rvb2xzPg0KKyAgICA8dG9vbHMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCINCisgICAgICAgIHRpdGxlPSJBdG9taWMgVW5pdHMiDQorICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSI+DQorICAgICAgPHRvb2xzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgdGl0bGU9IkF0b21pY1VuaXQiDQorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEF0b21pY1VuaXQiPg0KKyAgICAgICAgPHNtYWxsSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgICAgPGxhcmdlSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgIDwvdG9vbHM+DQorICAgIDwvdG9vbHM+DQorICAgIDx0b29scw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIg0KKyAgICAgICAgdGl0bGU9IkZpbHRlciBVbml0cyINCisgICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIj4NCisgICAgICA8dG9vbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICB0aXRsZT0iTXVsdGlGaWx0ZXJVbml0Ig0KKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNdWx0aUZpbHRlclVuaXQiPg0KKyAgICAgICAgPHNtYWxsSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgICAgPGxhcmdlSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgIDwvdG9vbHM+DQorICAgICAgPHRvb2xzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgdGl0bGU9IlNpbmdsZUZpbHRlclVuaXQiDQorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFNpbmdsZUZpbHRlclVuaXQiPg0KKyAgICAgICAgPHNtYWxsSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgICAgPGxhcmdlSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgIDwvdG9vbHM+DQorICAgIDwvdG9vbHM+DQorICAgIDx0b29scw0KKyAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIg0KKyAgICAgICAgdGl0bGU9IkZlYXR1cmUgVW5pdHMiDQorICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSI+DQorICAgICAgPHRvb2xzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgdGl0bGU9Ik11bHRpRmVhdHVyZVVuaXQiDQorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE11bHRpRmVhdHVyZVVuaXQiPg0KKyAgICAgICAgPHNtYWxsSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgICAgPGxhcmdlSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgIDwvdG9vbHM+DQorICAgICAgPHRvb2xzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgdGl0bGU9IlNpbmdsZUZlYXR1cmVVbml0Ig0KKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTaW5nbGVGZWF0dXJlVW5pdCI+DQorICAgICAgICA8c21hbGxJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgICA8bGFyZ2VJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgPC90b29scz4NCisgICAgPC90b29scz4NCisgICAgPHRvb2xzDQorICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiDQorICAgICAgICB0aXRsZT0iUG9ydHMiDQorICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSI+DQorICAgICAgPHRvb2xzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgdGl0bGU9Ik11bHRpSW5wdXRQb3J0Ig0KKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNdWx0aUlucHV0UG9ydCI+DQorICAgICAgICA8c21hbGxJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgICA8bGFyZ2VJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgPC90b29scz4NCisgICAgICA8dG9vbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICB0aXRsZT0iTXVsdGlPdXRwdXRQb3J0Ig0KKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNdWx0aU91dHB1dFBvcnQiPg0KKyAgICAgICAgPHNtYWxsSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgICAgPGxhcmdlSWNvbg0KKyAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPg0KKyAgICAgIDwvdG9vbHM+DQorICAgICAgPHRvb2xzDQorICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCINCisgICAgICAgICAgdGl0bGU9IlNpbmdsZUlucHV0UG9ydCINCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU2luZ2xlSW5wdXRQb3J0Ij4NCisgICAgICAgIDxzbWFsbEljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICAgIDxsYXJnZUljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICA8L3Rvb2xzPg0KKyAgICAgIDx0b29scw0KKyAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiDQorICAgICAgICAgIHRpdGxlPSJTaW5nbGVPdXRwdXRQb3J0Ig0KKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBTaW5nbGVPdXRwdXRQb3J0Ij4NCisgICAgICAgIDxzbWFsbEljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICAgIDxsYXJnZUljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICA8L3Rvb2xzPg0KKyAgICA8L3Rvb2xzPg0KKyAgICA8dG9vbHMNCisgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOlRvb2xHcm91cCINCisgICAgICAgIHRpdGxlPSJNYXBwaW5ncyINCisgICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIj4NCisgICAgICA8dG9vbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICB0aXRsZT0iTXVsdGlQb3J0TWFwcGluZyINCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTXVsdGlQb3J0TWFwcGluZyI+DQorICAgICAgICA8c21hbGxJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgICA8bGFyZ2VJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgPC90b29scz4NCisgICAgICA8dG9vbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICB0aXRsZT0iTXVsdGlTaW5nbGVQb3J0TWFwcGluZyINCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTXVsdGlTaW5nbGVQb3J0TWFwcGluZyI+DQorICAgICAgICA8c21hbGxJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgICA8bGFyZ2VJY29uDQorICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+DQorICAgICAgPC90b29scz4NCisgICAgICA8dG9vbHMNCisgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIg0KKyAgICAgICAgICB0aXRsZT0iU2luZ2xlUG9ydE1hcHBpbmciDQorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFNpbmdsZVBvcnRNYXBwaW5nIj4NCisgICAgICAgIDxzbWFsbEljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICAgIDxsYXJnZUljb24NCisgICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4NCisgICAgICA8L3Rvb2xzPg0KKyAgICA8L3Rvb2xzPg0KKyAgPC9wYWxldHRlPg0KKzwvZ21mdG9vbDpUb29sUmVnaXN0cnk+DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwudHJhY2UgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL21vZGVsL2NvbXJlbC50cmFjZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzhmYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9tb2RlbC9jb21yZWwudHJhY2UKQEAgLTAsMCArMSw4NjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHRyYWNlOlRyYWNlTW9kZWwgeG1pOnZlcnNpb249IjIuMCINCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIg0KKyAgICB4bWxuczp0cmFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNi9UcmFjZSI+DQorICA8bm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIyMDAxIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlSW5wdXRQb3J0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNb2RlbFJlZmFjdG9yaW5nJykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2lucHV0UG9ydHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDAxIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L25vZGVUcmFjZXM+DQorICA8bm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIyMDAyIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ2FydGVzaWFuUXVldWVkVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29tcG9zaXRlUmVmYWN0b3JpbmcnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnbWFpblJlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwODAiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAwMSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDAyIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L25vZGVUcmFjZXM+DQorICA8bm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIyMDAzIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb21wb3NpdGVSZWZhY3RvcmluZycpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdtYWluUmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA4MSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDc1Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzYiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvbm9kZVRyYWNlcz4NCisgIDxub2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjIwMDQiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb21wb3NpdGVSZWZhY3RvcmluZycpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdtYWluUmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA4MiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDc3Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvbm9kZVRyYWNlcz4NCisgIDxub2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjIwMDUiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTZXF1ZW50aWFsVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29tcG9zaXRlUmVmYWN0b3JpbmcnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnbWFpblJlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwODMiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA3OSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDgwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L25vZGVUcmFjZXM+DQorICA8bm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIyMDA2Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb21wb3NpdGVSZWZhY3RvcmluZycpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdtYWluUmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA4NCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDgxIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwODIiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA4MyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDg0Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L25vZGVUcmFjZXM+DQorICA8bm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIyMDA3Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQXRvbWljVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29tcG9zaXRlUmVmYWN0b3JpbmcnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnbWFpblJlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwODUiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvbm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAwMSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUlucHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ2FydGVzaWFuUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdzaW5nbGVJbnB1dFBvcnRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAwMiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMDIiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUlucHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ2FydGVzaWFuUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdtdWx0aUlucHV0UG9ydHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDAzIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAwMyINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NhcnRlc2lhblF1ZXVlZFVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NhcnRlc2lhblF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA3OSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDAzIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMDQiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDA0Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDYXJ0ZXNpYW5RdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNzgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAwNSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDA2Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAwNSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUlucHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3NpbmdsZUlucHV0UG9ydHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDA0Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAwNiINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ011bHRpSW5wdXRQb3J0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdQYXJhbGxlbFF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnbXVsdGlJbnB1dFBvcnRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAwNSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMDciDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDYXJ0ZXNpYW5RdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdQYXJhbGxlbFF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNzciDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAwNyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDA4Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAwOCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZlYXR1cmVVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDYXJ0ZXNpYW5RdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAwOSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMDkiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVJbnB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZlYXR1cmVVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2lucHV0UG9ydCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMDYiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDEwIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlJbnB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZlYXR1cmVVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3NlY29uZGFyeUlucHV0UG9ydHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDA3Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAxMSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZU91dHB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZlYXR1cmVVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ291dHB1dFBvcnQnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDA4Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAxMiINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ011bHRpRmVhdHVyZVVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NhcnRlc2lhblF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaGVscGVyVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDEzIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAxMyINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUlucHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGZWF0dXJlVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdpbnB1dFBvcnQnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDEwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAxNCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ011bHRpSW5wdXRQb3J0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUZlYXR1cmVVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3NlY29uZGFyeUlucHV0UG9ydHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDExIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAxNSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ011bHRpT3V0cHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGZWF0dXJlVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdvdXRwdXRQb3J0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAxMiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMTYiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVGaWx0ZXJVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDYXJ0ZXNpYW5RdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAxNiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMTciDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUlucHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlRmlsdGVyVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdpbnB1dFBvcnQnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDE0Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAxOCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZU91dHB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZpbHRlclVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnb3V0cHV0UG9ydCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMTUiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDE5Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGaWx0ZXJVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDYXJ0ZXNpYW5RdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAxOSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMjAiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUlucHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGaWx0ZXJVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2lucHV0UG9ydCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMTciDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDIxIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlPdXRwdXRQb3J0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUZpbHRlclVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnb3V0cHV0UG9ydCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMTgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDIyIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlUXVldWVkVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ2FydGVzaWFuUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdyZWZhY3RvcmluZ1VuaXQnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDc2Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMDkiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAxMCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMjMiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVJbnB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZVF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnc2luZ2xlSW5wdXRQb3J0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMjAiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDI0Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlJbnB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZVF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnbXVsdGlJbnB1dFBvcnQnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDIxIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAyNSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NhcnRlc2lhblF1ZXVlZFVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZVF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA3NSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDExIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMTIiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDI2Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2VxdWVudGlhbFVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NhcnRlc2lhblF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA3NCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDEzIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMTQiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDI3Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlSW5wdXRQb3J0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTZXF1ZW50aWFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdpbnB1dFBvcnRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAyMiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMjgiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUlucHV0UG9ydCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2VxdWVudGlhbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaW5wdXRQb3J0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMjMiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDI5Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ2FydGVzaWFuUXVldWVkVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2VxdWVudGlhbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNzMiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAxNSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDE2Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAzMCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ2FydGVzaWFuUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdyZWZhY3RvcmluZ1VuaXQnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDcyIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMTciDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAxOCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDE5Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjAiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDMxIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlSW5wdXRQb3J0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb25kaXRpb25hbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaW5wdXRQb3J0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMjQiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDMyIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlJbnB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdpbnB1dFBvcnRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAyNSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMzMiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDYXJ0ZXNpYW5RdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb25kaXRpb25hbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAndGhlbicpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMjgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAyMSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDIyIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAzNCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0F0b21pY1VuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NhcnRlc2lhblF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAyNyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMzUiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVJbnB1dFBvcnQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0F0b21pY1VuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaW5wdXRQb3J0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMjYiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDM2Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb25kaXRpb25hbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAndGhlbicpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNzEiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAyMyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDI0Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzAzNyINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1BhcmFsbGVsUXVldWVkVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDcwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjUiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAyNiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMzgiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVGZWF0dXJlVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAyOSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwMzkiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUZlYXR1cmVVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdQYXJhbGxlbFF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaGVscGVyVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDMwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA0MCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZpbHRlclVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1BhcmFsbGVsUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdoZWxwZXJVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMzEiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDQxIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGaWx0ZXJVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdQYXJhbGxlbFF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaGVscGVyVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDMyIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA0MiINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZVF1ZXVlZFVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1BhcmFsbGVsUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdyZWZhY3RvcmluZ1VuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA2OSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDI3Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMjgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDQzIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNjgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAyOSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDMwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA0NCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NlcXVlbnRpYWxVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdQYXJhbGxlbFF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNjciDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAzMSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDMyIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA0NSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1BhcmFsbGVsUXVldWVkVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2VxdWVudGlhbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNjYiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAzMyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDM0Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA0NiINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDY1Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMzUiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzAzNiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDM3Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMzgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDQ3Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ2FydGVzaWFuUXVldWVkVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2Vsc2UnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDMzIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwMzkiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA0MCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNDgiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdQYXJhbGxlbFF1ZXVlZFVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdlbHNlJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAzNSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDQxIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNDIiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDQ5Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQXRvbWljVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnUGFyYWxsZWxRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDM0Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA1MCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZlYXR1cmVVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb25kaXRpb25hbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaGVscGVyVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDM2Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA1MSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ011bHRpRmVhdHVyZVVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdoZWxwZXJVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMzciDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDUyIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlRmlsdGVyVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTAzOCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNTMiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUZpbHRlclVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdoZWxwZXJVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwMzkiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDU0Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlUXVldWVkVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3RoZW4nKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDY0Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNDMiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA0NCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNTUiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVGZWF0dXJlVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdoZWxwZXJVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNDAiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDU2Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGZWF0dXJlVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdoZWxwZXJVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNDEiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDU3Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlRmlsdGVyVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlUXVldWVkVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdoZWxwZXJVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNDIiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDU4Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGaWx0ZXJVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA0MyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNTkiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNjMiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA0NSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDQ2Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA2MCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NlcXVlbnRpYWxVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNjIiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA0NyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDQ4Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA2MSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZlYXR1cmVVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTZXF1ZW50aWFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdoZWxwZXJVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNDQiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDYyIg0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnTXVsdGlGZWF0dXJlVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2VxdWVudGlhbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnaGVscGVyVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDQ1Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA2MyINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZUZpbHRlclVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NlcXVlbnRpYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA0NiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNjQiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdNdWx0aUZpbHRlclVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NlcXVlbnRpYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2hlbHBlclVuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA0NyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNjUiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTZXF1ZW50aWFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdyZWZhY3RvcmluZ1VuaXRzJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA2MSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDQ5Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNTAiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDY2Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdCcpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNjAiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA1MSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDUyIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNTMiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA1NCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNjciDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTaW5nbGVRdWV1ZWRVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb25kaXRpb25hbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnZWxzZScpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNDkiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA1NSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDU2Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA2OCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0F0b21pY1VuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NpbmdsZVF1ZXVlZFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0JykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA0OCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNjkiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTZXF1ZW50aWFsVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3RoZW4nKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDU5Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNTciDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA1OCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNzAiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdTZXF1ZW50aWFsVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2VxdWVudGlhbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNTgiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA1OSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDYwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA3MSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2VxdWVudGlhbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAncmVmYWN0b3JpbmdVbml0cycpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNTciDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA2MSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDYyIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNjMiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA2NCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8Y2hpbGROb2RlVHJhY2VzDQorICAgICAgdmlzdWFsSUQ9IjMwNzIiDQorICAgICAgcXVlcnlUZXh0PSIobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm1ldGFDbGFzcy5lY29yZUNsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb25kaXRpb25hbFVuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICd0aGVuJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA1NiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDY1Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNjYiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA2NyINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDY4Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA3MyINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NlcXVlbnRpYWxVbml0JykgYW5kIChsZXQgX2NvbnRhaW5tZW50TUZfOmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUgPSBtb2RlbEZhY2V0LmNvbnRhaW5tZW50TWV0YUZlYXR1cmUuZWNvcmVGZWF0dXJlIGluIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IF9jb250YWlubWVudE1GXy5lQ29udGFpbmluZ0NsYXNzIGluIF9lQ2xhc3NfLmVQYWNrYWdlLm5zVVJJID0gJ2h0dHA6Ly9jb21yZWwvMC4xJyBhbmQgX2VDbGFzc18ubmFtZSA9ICdDb25kaXRpb25hbFVuaXQnKSBhbmQgX2NvbnRhaW5tZW50TUZfLm5hbWUgPSAnZWxzZScpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNTEiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA2OSINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDcwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA3NCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0F0b21pY1VuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ1NlcXVlbnRpYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3JlZmFjdG9yaW5nVW5pdHMnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDUwIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA3NSINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ2Vsc2UnKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDU1Ig0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzEiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgICAgPGNvbXBhcnRtZW50VHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNzA3MiINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgICA8Y29tcGFydG1lbnRUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI3MDczIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICAgIDxjb21wYXJ0bWVudFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjcwNzQiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDc2Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uQ2hlY2snKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdpZicpIj4NCisgICAgPG5vZGVMYWJlbFRyYWNlcw0KKyAgICAgICAgdmlzdWFsSUQ9IjUwNTIiDQorICAgICAgICBxdWVyeVRleHQ9InRydWUiLz4NCisgIDwvY2hpbGROb2RlVHJhY2VzPg0KKyAgPGNoaWxkTm9kZVRyYWNlcw0KKyAgICAgIHZpc3VhbElEPSIzMDc3Ig0KKyAgICAgIHF1ZXJ5VGV4dD0iKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gbW9kZWxGYWNldC5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQXRvbWljVW5pdCcpIGFuZCAobGV0IF9jb250YWlubWVudE1GXzplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlID0gbW9kZWxGYWNldC5jb250YWlubWVudE1ldGFGZWF0dXJlLmVjb3JlRmVhdHVyZSBpbiAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBfY29udGFpbm1lbnRNRl8uZUNvbnRhaW5pbmdDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnQ29uZGl0aW9uYWxVbml0JykgYW5kIF9jb250YWlubWVudE1GXy5uYW1lID0gJ3RoZW4nKSI+DQorICAgIDxub2RlTGFiZWxUcmFjZXMNCisgICAgICAgIHZpc3VhbElEPSI1MDUzIg0KKyAgICAgICAgcXVlcnlUZXh0PSJ0cnVlIi8+DQorICA8L2NoaWxkTm9kZVRyYWNlcz4NCisgIDxjaGlsZE5vZGVUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iMzA3OCINCisgICAgICBxdWVyeVRleHQ9IihsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0F0b21pY1VuaXQnKSBhbmQgKGxldCBfY29udGFpbm1lbnRNRl86ZWNvcmU6OkVTdHJ1Y3R1cmFsRmVhdHVyZSA9IG1vZGVsRmFjZXQuY29udGFpbm1lbnRNZXRhRmVhdHVyZS5lY29yZUZlYXR1cmUgaW4gKGxldCBfZUNsYXNzXzplY29yZTo6RUNsYXNzID0gX2NvbnRhaW5tZW50TUZfLmVDb250YWluaW5nQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ0NvbmRpdGlvbmFsVW5pdCcpIGFuZCBfY29udGFpbm1lbnRNRl8ubmFtZSA9ICdlbHNlJykiPg0KKyAgICA8bm9kZUxhYmVsVHJhY2VzDQorICAgICAgICB2aXN1YWxJRD0iNTA1NCINCisgICAgICAgIHF1ZXJ5VGV4dD0idHJ1ZSIvPg0KKyAgPC9jaGlsZE5vZGVUcmFjZXM+DQorICA8bGlua1RyYWNlcw0KKyAgICAgIHZpc3VhbElEPSI0MDAxIg0KKyAgICAgIHF1ZXJ5VGV4dD0ibW9kZWxGYWNldC5vY2xJc0tpbmRPZihnbWZnZW46OlR5cGVMaW5rTW9kZWxGYWNldCkgYW5kIChsZXQgX2VDbGFzc186ZWNvcmU6OkVDbGFzcyA9IG1vZGVsRmFjZXQub2NsQXNUeXBlKGdtZmdlbjo6VHlwZUxpbmtNb2RlbEZhY2V0KS5tZXRhQ2xhc3MuZWNvcmVDbGFzcyBpbiBfZUNsYXNzXy5lUGFja2FnZS5uc1VSSSA9ICdodHRwOi8vY29tcmVsLzAuMScgYW5kIF9lQ2xhc3NfLm5hbWUgPSAnU2luZ2xlUG9ydE1hcHBpbmcnKSIvPg0KKyAgPGxpbmtUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iNDAwMiINCisgICAgICBxdWVyeVRleHQ9Im1vZGVsRmFjZXQub2NsSXNLaW5kT2YoZ21mZ2VuOjpUeXBlTGlua01vZGVsRmFjZXQpIGFuZCAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm9jbEFzVHlwZShnbWZnZW46OlR5cGVMaW5rTW9kZWxGYWNldCkubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ011bHRpUG9ydE1hcHBpbmcnKSIvPg0KKyAgPGxpbmtUcmFjZXMNCisgICAgICB2aXN1YWxJRD0iNDAwMyINCisgICAgICBxdWVyeVRleHQ9Im1vZGVsRmFjZXQub2NsSXNLaW5kT2YoZ21mZ2VuOjpUeXBlTGlua01vZGVsRmFjZXQpIGFuZCAobGV0IF9lQ2xhc3NfOmVjb3JlOjpFQ2xhc3MgPSBtb2RlbEZhY2V0Lm9jbEFzVHlwZShnbWZnZW46OlR5cGVMaW5rTW9kZWxGYWNldCkubWV0YUNsYXNzLmVjb3JlQ2xhc3MgaW4gX2VDbGFzc18uZVBhY2thZ2UubnNVUkkgPSAnaHR0cDovL2NvbXJlbC8wLjEnIGFuZCBfZUNsYXNzXy5uYW1lID0gJ011bHRpU2luZ2xlUG9ydE1hcHBpbmcnKSIvPg0KKzwvdHJhY2U6VHJhY2VNb2RlbD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdlYzYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDggQEAKKw0KKyMgPGNvcHlyaWdodD4NCisjIDwvY29weXJpZ2h0Pg0KKyMNCisjICRJZCQNCisNCitwbHVnaW5OYW1lID0gQ29tcmVsIE1vZGVsDQorcHJvdmlkZXJOYW1lID0gd3d3LmV4YW1wbGUub3JnDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGE2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3BsdWdpbi54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQorDQorPCEtLQ0KKyA8Y29weXJpZ2h0Pg0KKyA8L2NvcHlyaWdodD4NCisNCisgJElkJA0KKy0tPg0KKw0KKzxwbHVnaW4+DQorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2luZ2xlZmlsdGVyIiBuYW1lPSJzaW5nbGVmaWx0ZXIiIHNjaGVtYT0ic2NoZW1hL3NpbmdsZWZpbHRlci5leHNkIi8+DQorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibXVsdGlmaWx0ZXIiIG5hbWU9Im11bHRpZmlsdGVyIiBzY2hlbWE9InNjaGVtYS9tdWx0aWZpbHRlci5leHNkIi8+DQorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2luZ2xlZmVhdHVyZSIgbmFtZT0ic2luZ2xlZmVhdHVyZSIgc2NoZW1hPSJzY2hlbWEvc2luZ2xlZmVhdHVyZS5leHNkIi8+DQorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibXVsdGlmZWF0dXJlIiBuYW1lPSJtdWx0aWZlYXR1cmUiIHNjaGVtYT0ic2NoZW1hL211bHRpZmVhdHVyZS5leHNkIi8+DQorICAgDQorDQorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4NCisgICAgICA8cGFja2FnZQ0KKyAgICAgICAgICAgIHVyaT0iaHR0cDovL2NvbXJlbC8wLjEiDQorICAgICAgICAgICAgY2xhc3M9ImNvbXJlbC5Db21yZWxQYWNrYWdlIg0KKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9jb21yZWwuZ2VubW9kZWwiLz4NCisgICA8L2V4dGVuc2lvbj4NCisNCis8L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NjaGVtYS9tdWx0aWZlYXR1cmUuZXhzZCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc2NoZW1hL211bHRpZmVhdHVyZS5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzFiZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NjaGVtYS9tdWx0aWZlYXR1cmUuZXhzZApAQCAtMCwwICsxLDEzMCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJjb21yZWwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQorPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0iY29tcmVsIiBpZD0ibXVsdGlmZWF0dXJlIiBuYW1lPSJtdWx0aWZlYXR1cmUiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPg0KKyAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9Im11bHRpZmVhdHVyZSIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9Im11bHRpZmVhdHVyZSI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZVVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOmNvbXJlbC5leHRlbnNpb25zLklNdWx0aUZlYXR1cmVIZWxwZXIiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc2NoZW1hL211bHRpZmlsdGVyLmV4c2QgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NjaGVtYS9tdWx0aWZpbHRlci5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTU3ODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NjaGVtYS9tdWx0aWZpbHRlci5leHNkCkBAIC0wLDAgKzEsMTMwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvbXJlbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJjb21yZWwiIGlkPSJtdWx0aWZpbHRlciIgbmFtZT0ibXVsdGlmaWx0ZXIiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPg0KKyAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9Im11bHRpZmlsdGVyIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0ibXVsdGlmaWx0ZXIiPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2VVcmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Ijpjb21yZWwuZXh0ZW5zaW9ucy5JTXVsdGlGaWx0ZXJIZWxwZXIiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc2NoZW1hL3NpbmdsZWZlYXR1cmUuZXhzZCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc2NoZW1hL3NpbmdsZWZlYXR1cmUuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjkwZGJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zY2hlbWEvc2luZ2xlZmVhdHVyZS5leHNkCkBAIC0wLDAgKzEsMTMwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvbXJlbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJjb21yZWwiIGlkPSJzaW5nbGVmZWF0dXJlIiBuYW1lPSJzaW5nbGVmZWF0dXJlIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCisgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzaW5nbGVmZWF0dXJlIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0ic2luZ2xlZmVhdHVyZSI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZVVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOmNvbXJlbC5leHRlbnNpb25zLklTaW5nbGVGZWF0dXJlSGVscGVyIi8+DQorICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisNCis8L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NjaGVtYS9zaW5nbGVmaWx0ZXIuZXhzZCBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc2NoZW1hL3NpbmdsZWZpbHRlci5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDJlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NjaGVtYS9zaW5nbGVmaWx0ZXIuZXhzZApAQCAtMCwwICsxLDEzMCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJjb21yZWwiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQorPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0iY29tcmVsIiBpZD0ic2luZ2xlZmlsdGVyIiBuYW1lPSJzaW5nbGVmaWx0ZXIiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPg0KKyAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9InNpbmdsZWZpbHRlciIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9InNpbmdsZWZpbHRlciI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZVVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOmNvbXJlbC5leHRlbnNpb25zLklTaW5nbGVGaWx0ZXJIZWxwZXIiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9BdG9taWNVbml0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQXRvbWljVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODc1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQXRvbWljVW5pdC5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdG9taWMgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQXRvbWljVW5pdCNnZXRJbnB1dFBvcnRzIDxlbT5JbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2dldFVuaXRJZCA8ZW0+VW5pdCBJZDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2dldE5hbWVzcGFjZVVyaSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQXRvbWljVW5pdCNnZXRNb2RlbFJlZmFjdG9yaW5nIDxlbT5Nb2RlbCBSZWZhY3RvcmluZzwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2lzQ2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZyA8ZW0+Q2hlY2sgSW5pdGlhbCBDb25kaXRpb24gRmxhZzwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2lzQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcgPGVtPkNoZWNrIEZpbmFsIENvbmRpdGlvbiBGbGFnPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0QXRvbWljVW5pdCgpDQorICogQG1vZGVsIGFubm90YXRpb249ImdtZi5ub2RlIGZvbz0nYmFyJyBsYWJlbC5pY29uPSdmYWxzZScgbGFiZWw9J2xhYmVsLHR5cGUnIGxhYmVsLnBhdHRlcm49J3swfTp7MX0nIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEF0b21pY1VuaXQgZXh0ZW5kcyBSZWZhY3RvcmluZ1VuaXQgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgY29tcmVsLlNpbmdsZUlucHV0UG9ydH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRBdG9taWNVbml0X0lucHV0UG9ydHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmFmZml4ZWQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxTaW5nbGVJbnB1dFBvcnQ+IGdldElucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXQgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaXQgSWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXQgSWQ8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRVbml0SWQoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEF0b21pY1VuaXRfVW5pdElkKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0VW5pdElkKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuQXRvbWljVW5pdCNnZXRVbml0SWQgPGVtPlVuaXQgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXQgSWQ8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRVbml0SWQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFVuaXRJZChTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxhYmVsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldExhYmVsKFN0cmluZykNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRBdG9taWNVbml0X0xhYmVsKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0TGFiZWwoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFiZWw8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRMYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0TGFiZWwoU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXROYW1lc3BhY2VVcmkoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEF0b21pY1VuaXRfTmFtZXNwYWNlVXJpKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuQXRvbWljVW5pdCNnZXROYW1lc3BhY2VVcmkgPGVtPk5hbWVzcGFjZSBVcmk8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE5hbWVzcGFjZVVyaShTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iQXRvbWljIFVuaXQiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEF0b21pY1VuaXRfVHlwZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJBdG9taWMgVW5pdCIgY2hhbmdlYWJsZT0iZmFsc2UiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRUeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2RlbCBSZWZhY3RvcmluZzwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZGVsIFJlZmFjdG9yaW5nPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0TW9kZWxSZWZhY3RvcmluZyhNb2RlbFJlZmFjdG9yaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEF0b21pY1VuaXRfTW9kZWxSZWZhY3RvcmluZygpDQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTW9kZWxSZWZhY3RvcmluZyBnZXRNb2RlbFJlZmFjdG9yaW5nKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuQXRvbWljVW5pdCNnZXRNb2RlbFJlZmFjdG9yaW5nIDxlbT5Nb2RlbCBSZWZhY3RvcmluZzwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRNb2RlbFJlZmFjdG9yaW5nKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRNb2RlbFJlZmFjdG9yaW5nKE1vZGVsUmVmYWN0b3JpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2sgSW5pdGlhbCBDb25kaXRpb24gRmxhZzwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrIEluaXRpYWwgQ29uZGl0aW9uIEZsYWc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrIEluaXRpYWwgQ29uZGl0aW9uIEZsYWc8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRDaGVja0luaXRpYWxDb25kaXRpb25GbGFnKGJvb2xlYW4pDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0QXRvbWljVW5pdF9DaGVja0luaXRpYWxDb25kaXRpb25GbGFnKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlib29sZWFuIGlzQ2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZygpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkF0b21pY1VuaXQjaXNDaGVja0luaXRpYWxDb25kaXRpb25GbGFnIDxlbT5DaGVjayBJbml0aWFsIENvbmRpdGlvbiBGbGFnPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVjayBJbml0aWFsIENvbmRpdGlvbiBGbGFnPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjaXNDaGVja0luaXRpYWxDb25kaXRpb25GbGFnKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRDaGVja0luaXRpYWxDb25kaXRpb25GbGFnKGJvb2xlYW4gdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2sgRmluYWwgQ29uZGl0aW9uIEZsYWc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGVjayBGaW5hbCBDb25kaXRpb24gRmxhZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2sgRmluYWwgQ29uZGl0aW9uIEZsYWc8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZyhib29sZWFuKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEF0b21pY1VuaXRfQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKQ0KKwkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWJvb2xlYW4gaXNDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZygpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkF0b21pY1VuaXQjaXNDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZyA8ZW0+Q2hlY2sgRmluYWwgQ29uZGl0aW9uIEZsYWc8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrIEZpbmFsIENvbmRpdGlvbiBGbGFnPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjaXNDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0Q2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoYm9vbGVhbiB2YWx1ZSk7DQorDQorfSAvLyBBdG9taWNVbml0DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0NhcnRlc2lhblF1ZXVlZFVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmZTllZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9DYXJ0ZXNpYW5RdWV1ZWRVbml0LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcnRlc2lhbiBRdWV1ZWQgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRIZWxwZXJVbml0cyA8ZW0+SGVscGVyIFVuaXRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0IDxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQjZ2V0U2luZ2xlSW5wdXRQb3J0cyA8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQjZ2V0TXVsdGlJbnB1dFBvcnRzIDxlbT5NdWx0aSBJbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0I2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRMYmxTdHJpY3QgPGVtPkxibCBTdHJpY3Q8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkNCisgKiBAbW9kZWwgYW5ub3RhdGlvbj0iZ21mLm5vZGUgZm9vPSdiYXInIGxhYmVsLmljb249J2ZhbHNlJyBsYWJlbD0nbmFtZSx0eXBlLGxibFN0cmljdCcgbGFiZWwucGF0dGVybj0nezB9OnsxfSAtezJ9LSciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQ2FydGVzaWFuUXVldWVkVW5pdCBleHRlbmRzIFR3aWNlZFF1ZXVlZFVuaXQgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVscGVyIFVuaXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGNvbXJlbC5IZWxwZXJVbml0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlbHBlciBVbml0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWxwZXIgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9IZWxwZXJVbml0cygpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5jb21wYXJ0bWVudCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PEhlbHBlclVuaXQ+IGdldEhlbHBlclVuaXRzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZhY3RvcmluZyBVbml0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0UmVmYWN0b3JpbmdVbml0KFJlZmFjdG9yaW5nVW5pdCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuY29tcGFydG1lbnQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlSZWZhY3RvcmluZ1VuaXQgZ2V0UmVmYWN0b3JpbmdVbml0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRSZWZhY3RvcmluZ1VuaXQgPGVtPlJlZmFjdG9yaW5nIFVuaXQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmFjdG9yaW5nIFVuaXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRSZWZhY3RvcmluZ1VuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFJlZmFjdG9yaW5nVW5pdChSZWZhY3RvcmluZ1VuaXQgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2luZ2xlIElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGNvbXJlbC5TaW5nbGVJbnB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuYWZmaXhlZCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PFNpbmdsZUlucHV0UG9ydD4gZ2V0U2luZ2xlSW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGkgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgY29tcmVsLk11bHRpSW5wdXRQb3J0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11bHRpIElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpIElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiBsb3dlcj0iMiIgdXBwZXI9IjIiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuYWZmaXhlZCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PE11bHRpSW5wdXRQb3J0PiBnZXRNdWx0aUlucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkNhcnRlc2lhbiBRdWV1ZWQgVW5pdCI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9UeXBlKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IkNhcnRlc2lhbiBRdWV1ZWQgVW5pdCIgY2hhbmdlYWJsZT0iZmFsc2UiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRUeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYmwgU3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJzdHJpY3QiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxibCBTdHJpY3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxibCBTdHJpY3Q8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRMYmxTdHJpY3QoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENhcnRlc2lhblF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkNCisJICogQG1vZGVsIGRlZmF1bHQ9InN0cmljdCINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldExibFN0cmljdCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYmwgU3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0TGJsU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRMYmxTdHJpY3QoU3RyaW5nIHZhbHVlKTsNCisNCit9IC8vIENhcnRlc2lhblF1ZXVlZFVuaXQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29tcG9zaXRlUmVmYWN0b3JpbmcuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Db21wb3NpdGVSZWZhY3RvcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTQ5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29tcG9zaXRlUmVmYWN0b3JpbmcuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvc2l0ZSBSZWZhY3RvcmluZzwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcjZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCA8ZW0+TWFpbiBSZWZhY3RvcmluZyBVbml0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldFBvcnRNYXBwaW5ncyA8ZW0+UG9ydCBNYXBwaW5nczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyNnZXRNb2RlbFJlZmFjdG9yaW5ncyA8ZW0+TW9kZWwgUmVmYWN0b3JpbmdzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldEhlbHBlciA8ZW0+SGVscGVyPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uIDxlbT5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcjZ2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbiA8ZW0+Q3VzdG9tIEluaXRpYWwgQ29uZGl0aW9uPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldEN1c3RvbUZpbmFsQ29uZGl0aW9uIDxlbT5DdXN0b20gRmluYWwgQ29uZGl0aW9uPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKQ0KKyAqIEBtb2RlbCBhbm5vdGF0aW9uPSJnbWYuZGlhZ3JhbSBmb289J2Jhcicgb25lZmlsZT0nZmFsc2UnIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIENvbXBvc2l0ZVJlZmFjdG9yaW5nIGV4dGVuZHMgTW9kZWxSZWZhY3RvcmluZyB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYWluIFJlZmFjdG9yaW5nIFVuaXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1haW4gUmVmYWN0b3JpbmcgVW5pdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBSZWZhY3RvcmluZyBVbml0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0TWFpblJlZmFjdG9yaW5nVW5pdChSZWZhY3RvcmluZ1VuaXQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfTWFpblJlZmFjdG9yaW5nVW5pdCgpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVJlZmFjdG9yaW5nVW5pdCBnZXRNYWluUmVmYWN0b3JpbmdVbml0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcjZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCA8ZW0+TWFpbiBSZWZhY3RvcmluZyBVbml0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIFJlZmFjdG9yaW5nIFVuaXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRNYWluUmVmYWN0b3JpbmdVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRNYWluUmVmYWN0b3JpbmdVbml0KFJlZmFjdG9yaW5nVW5pdCB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGNvbXJlbC5Qb3J0TWFwcGluZ30uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfUG9ydE1hcHBpbmdzKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxQb3J0TWFwcGluZz4gZ2V0UG9ydE1hcHBpbmdzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2RlbCBSZWZhY3RvcmluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3Jpbmd9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kZWwgUmVmYWN0b3JpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZGVsIFJlZmFjdG9yaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19Nb2RlbFJlZmFjdG9yaW5ncygpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUxpc3Q8TW9kZWxSZWZhY3RvcmluZz4gZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlbHBlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuSGVscGVyfS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlbHBlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWxwZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfSGVscGVyKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxIZWxwZXI+IGdldEhlbHBlcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIwIjwvY29kZT4uDQorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIGNvbXJlbC5NYXBwaW5nVmlzdWFsaXphdGlvbn0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBpbmcgVmlzdWFsaXphdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgY29tcmVsLk1hcHBpbmdWaXN1YWxpemF0aW9uDQorCSAqIEBzZWUgI3NldE1hcHBpbmdWaXN1YWxpemF0aW9uKE1hcHBpbmdWaXN1YWxpemF0aW9uKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENvbXBvc2l0ZVJlZmFjdG9yaW5nX01hcHBpbmdWaXN1YWxpemF0aW9uKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IjAiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlNYXBwaW5nVmlzdWFsaXphdGlvbiBnZXRNYXBwaW5nVmlzdWFsaXphdGlvbigpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uIDxlbT5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBpbmcgVmlzdWFsaXphdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgY29tcmVsLk1hcHBpbmdWaXN1YWxpemF0aW9uDQorCSAqIEBzZWUgI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRNYXBwaW5nVmlzdWFsaXphdGlvbihNYXBwaW5nVmlzdWFsaXphdGlvbiB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXN0b20gSW5pdGlhbCBDb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbSBJbml0aWFsIENvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9tIEluaXRpYWwgQ29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbihTdHJpbmcpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfQ3VzdG9tSW5pdGlhbENvbmRpdGlvbigpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbigpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldEN1c3RvbUluaXRpYWxDb25kaXRpb24gPGVtPkN1c3RvbSBJbml0aWFsIENvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9tIEluaXRpYWwgQ29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbihTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9tIEZpbmFsIENvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9tIEZpbmFsIENvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9tIEZpbmFsIENvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEN1c3RvbUZpbmFsQ29uZGl0aW9uKFN0cmluZykNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19DdXN0b21GaW5hbENvbmRpdGlvbigpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0Q3VzdG9tRmluYWxDb25kaXRpb24oKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyNnZXRDdXN0b21GaW5hbENvbmRpdGlvbiA8ZW0+Q3VzdG9tIEZpbmFsIENvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9tIEZpbmFsIENvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldEN1c3RvbUZpbmFsQ29uZGl0aW9uKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRDdXN0b21GaW5hbENvbmRpdGlvbihTdHJpbmcgdmFsdWUpOw0KKwkNCisJcHVibGljIE1vZGVsUmVmYWN0b3JpbmcgZ2V0TW9kZWxSZWZhY3RvcmluZyhTdHJpbmcgaWQpOw0KKwkNCisJcHVibGljIEhlbHBlciBnZXRIZWxwZXIoU3RyaW5nIGlkKTsNCisNCisJcHVibGljIFNpbmdsZUZlYXR1cmVIZWxwZXIgZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcihTdHJpbmcgaWQpOw0KKwkNCisJcHVibGljIE11bHRpRmVhdHVyZUhlbHBlciBnZXRNdWx0aUZlYXR1cmVIZWxwZXIoU3RyaW5nIGlkKTsNCisJDQorCXB1YmxpYyBDb2xsZWN0aW9uPE1vZGVsUmVmYWN0b3Jpbmc+IGdldEVtZlJlZmFjdG9yaW5nc0FzTW9kZWxSZWZhY3RvcmluZ3MoKTsNCisJDQorCXB1YmxpYyBNb2RlbFJlZmFjdG9yaW5nIGdldEVtZlJlZmFjdG9yaW5nQXNNb2RlbFJlZmFjdG9yaW5nKFN0cmluZyBpZCk7CQ0KKwkNCisJcHVibGljIE11bHRpRmlsdGVySGVscGVyIGdldE11bHRpRmlsdGVySGVscGVyKFN0cmluZyBpZCk7DQorDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJIZWxwZXIgZ2V0U2luZ2xlRmlsdGVySGVscGVyKFN0cmluZyBpZCk7DQorDQorCXB1YmxpYyBib29sZWFuIG1vZGVsUmVmYWN0b3JpbmdJblVzZShNb2RlbFJlZmFjdG9yaW5nIHJlZiwgQXRvbWljVW5pdCBjb250ZXh0KTsNCisNCisJcHVibGljIGJvb2xlYW4gaGVscGVySW5Vc2UoSGVscGVyIGhlbHBlciwgSGVscGVyVW5pdCBjb250ZXh0KTsNCisNCisJcHVibGljIHZvaWQgcmVtb3ZlVW51c2VkTW9kZWxSZWZhY3RvcmluZ3MoKTsNCisNCisJcHVibGljIHZvaWQgcmVtb3ZlVW51c2VkSGVscGVyKCk7DQorDQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gdXBkYXRlUm9vdFVuaXQpOw0KKw0KKwlwdWJsaWMgdm9pZCBzZXRNYXBwaW5nTnVtYmVycyhTZXQ8SW50ZWdlcj4gbWFwcGluZ051bWJlcnMpOw0KKw0KKwlwdWJsaWMgU2V0PEludGVnZXI+IGdldE1hcHBpbmdOdW1iZXJzKCk7DQorDQorCXB1YmxpYyB2b2lkIGNsZWFuVXBNYXBwaW5nTnVtYmVycygpOw0KKw0KKwlwdWJsaWMgdm9pZCB1cGRhdGVWaXN1YWxpemF0aW9uKCk7DQorDQorfSAvLyBDb21wb3NpdGVSZWZhY3RvcmluZw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Db21wb3NpdGVVbml0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29tcG9zaXRlVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NDQ0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29tcG9zaXRlVW5pdC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvc2l0ZSBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDb21wb3NpdGVVbml0KCkNCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlVW5pdCBleHRlbmRzIFJlZmFjdG9yaW5nVW5pdCB7DQorCQ0KKwlFTGlzdDxIZWxwZXJVbml0PiBnZXRIZWxwZXJVbml0cygpOw0KKwkNCit9IC8vIENvbXBvc2l0ZVVuaXQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29tcmVsRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0NvbXJlbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNlNTIzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0NvbXJlbEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZQ0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIENvbXJlbEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7DQorCS8qKg0KKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQ29tcmVsRmFjdG9yeSBlSU5TVEFOQ0UgPSBjb21yZWwuaW1wbC5Db21yZWxGYWN0b3J5SW1wbC5pbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSZWZhY3RvcmluZzwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJlZmFjdG9yaW5nPC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlDb21wb3NpdGVSZWZhY3RvcmluZyBjcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2RlbCBSZWZhY3RvcmluZzwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU1vZGVsUmVmYWN0b3JpbmcgY3JlYXRlTW9kZWxSZWZhY3RvcmluZygpOw0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1vZGVsIFJlZmFjdG9yaW5nPC9lbT4nLg0KKwkgKi8NCisJTW9kZWxSZWZhY3RvcmluZyBjcmVhdGVNb2RlbFJlZmFjdG9yaW5nKFN0cmluZyBpZCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF0b21pYyBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdG9taWMgVW5pdDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQXRvbWljVW5pdCBjcmVhdGVBdG9taWNVbml0KCk7DQorCQ0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdG9taWMgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXRvbWljIFVuaXQ8L2VtPicuDQorCSAqLw0KKwlBdG9taWNVbml0IGNyZWF0ZUF0b21pY1VuaXQoTW9kZWxSZWZhY3RvcmluZyByZWZhY3RvcmluZyk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcXVlbnRpYWwgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VxdWVudGlhbCBVbml0PC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTZXF1ZW50aWFsVW5pdCBjcmVhdGVTZXF1ZW50aWFsVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25kaXRpb24gQ2hlY2s8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmRpdGlvbiBDaGVjazwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQ29uZGl0aW9uQ2hlY2sgY3JlYXRlQ29uZGl0aW9uQ2hlY2soKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uZGl0aW9uYWwgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uZGl0aW9uYWwgVW5pdDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQ29uZGl0aW9uYWxVbml0IGNyZWF0ZUNvbmRpdGlvbmFsVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgUXVldWVkIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbmdsZSBRdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlUXVldWVkVW5pdCBjcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhcnRlc2lhbiBRdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FydGVzaWFuIFF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlDYXJ0ZXNpYW5RdWV1ZWRVbml0IGNyZWF0ZUNhcnRlc2lhblF1ZXVlZFVuaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYWxsZWwgUXVldWVkIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFsbGVsIFF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlQYXJhbGxlbFF1ZXVlZFVuaXQgY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbmdsZSBGZWF0dXJlIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbmdsZSBGZWF0dXJlIFVuaXQ8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNpbmdsZUZlYXR1cmVVbml0IGNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0KCk7DQorCQ0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgRmVhdHVyZSBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgRmVhdHVyZSBVbml0PC9lbT4nLg0KKwkgKi8NCisJU2luZ2xlRmVhdHVyZVVuaXQgY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoU2luZ2xlRmVhdHVyZUhlbHBlciBoZWxwZXIpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBGZWF0dXJlIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIEZlYXR1cmUgVW5pdDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlGZWF0dXJlVW5pdCBjcmVhdGVNdWx0aUZlYXR1cmVVbml0KCk7DQorCQ0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBGZWF0dXJlIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIEZlYXR1cmUgVW5pdDwvZW0+Jy4NCisJICovDQorCU11bHRpRmVhdHVyZVVuaXQgY3JlYXRlTXVsdGlGZWF0dXJlVW5pdChNdWx0aUZlYXR1cmVIZWxwZXIgaGVscGVyKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2luZ2xlIEZpbHRlciBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgRmlsdGVyIFVuaXQ8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNpbmdsZUZpbHRlclVuaXQgY3JlYXRlU2luZ2xlRmlsdGVyVW5pdCgpOw0KKwkNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2luZ2xlIEZpbHRlciBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgRmlsdGVyIFVuaXQ8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNpbmdsZUZpbHRlclVuaXQgY3JlYXRlU2luZ2xlRmlsdGVyVW5pdChTaW5nbGVGaWx0ZXJIZWxwZXIgaGVscGVyKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGkgRmlsdGVyIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIEZpbHRlciBVbml0PC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlNdWx0aUZpbHRlclVuaXQgY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCk7DQorCQ0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBGaWx0ZXIgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGkgRmlsdGVyIFVuaXQ8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpRmlsdGVyVW5pdCBjcmVhdGVNdWx0aUZpbHRlclVuaXQoTXVsdGlGaWx0ZXJIZWxwZXIgaGVscGVyKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNpbmdsZUZlYXR1cmVIZWxwZXIgY3JlYXRlU2luZ2xlRmVhdHVyZUhlbHBlcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGkgRmVhdHVyZSBIZWxwZXI8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpRmVhdHVyZUhlbHBlciBjcmVhdGVNdWx0aUZlYXR1cmVIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2luZ2xlIEZpbHRlciBIZWxwZXI8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTaW5nbGVGaWx0ZXJIZWxwZXIgY3JlYXRlU2luZ2xlRmlsdGVySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpRmlsdGVySGVscGVyIGNyZWF0ZU11bHRpRmlsdGVySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbmdsZSBJbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgSW5wdXQgUG9ydDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlSW5wdXRQb3J0IGNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlNdWx0aUlucHV0UG9ydCBjcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgT3V0cHV0IFBvcnQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbmdsZSBPdXRwdXQgUG9ydDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlT3V0cHV0UG9ydCBjcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIE91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBPdXRwdXQgUG9ydDwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlPdXRwdXRQb3J0IGNyZWF0ZU11bHRpT3V0cHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT4nLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTaW5nbGVQb3J0TWFwcGluZyBjcmVhdGVTaW5nbGVQb3J0TWFwcGluZygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aSBQb3J0IE1hcHBpbmc8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIFBvcnQgTWFwcGluZzwvZW0+Jy4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlQb3J0TWFwcGluZyBjcmVhdGVNdWx0aVBvcnRNYXBwaW5nKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIFNpbmdsZSBQb3J0IE1hcHBpbmc8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpIFNpbmdsZSBQb3J0IE1hcHBpbmc8L2VtPicuDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpU2luZ2xlUG9ydE1hcHBpbmcgY3JlYXRlTXVsdGlTaW5nbGVQb3J0TWFwcGluZygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlDb21yZWxQYWNrYWdlIGdldENvbXJlbFBhY2thZ2UoKTsNCisNCit9IC8vQ29tcmVsRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Db21yZWxQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29tcmVsUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNzhjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29tcmVsUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsNTQ1MCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLg0KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQNCisgKiA8dWw+DQorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCisgKiA8L3VsPg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbEZhY3RvcnkNCisgKiBAbW9kZWwga2luZD0icGFja2FnZSINCisgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mIGZvbz0nYmFyJyINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBDb21yZWxQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Ugew0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBlTkFNRSA9ICJjb21yZWwiOw0KKw0KKwkvKioNCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9jb21yZWwvMC4xIjsNCisNCisJLyoqDQorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGVOU19QUkVGSVggPSAiY29tcmVsIjsNCisNCisJLyoqDQorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlDb21yZWxQYWNrYWdlIGVJTlNUQU5DRSA9IGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsLmluaXQoKTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5OYW1lZEVsZW1lbnQNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgTkFNRURfRUxFTUVOVCA9IDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE5BTUVEX0VMRU1FTlRfX05BTUUgPSAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuTW9kZWxSZWZhY3RvcmluZ0ltcGwgPGVtPk1vZGVsIFJlZmFjdG9yaW5nPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuTW9kZWxSZWZhY3RvcmluZ0ltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRNb2RlbFJlZmFjdG9yaW5nKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IE1PREVMX1JFRkFDVE9SSU5HID0gNDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTU9ERUxfUkVGQUNUT1JJTkdfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTU9ERUxfUkVGQUNUT1JJTkdfX0RFU0NSSVBUSU9OID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWYgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNT0RFTF9SRUZBQ1RPUklOR19fUkVGX0lEID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1PREVMX1JFRkFDVE9SSU5HX19MQUJFTCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1PREVMX1JFRkFDVE9SSU5HX19OQU1FU1BBQ0VfVVJJID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTU9ERUxfUkVGQUNUT1JJTkdfX0lOUFVUX1BPUlRTID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Nb2RlbCBSZWZhY3RvcmluZzwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNT0RFTF9SRUZBQ1RPUklOR19GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsIDxlbT5Db21wb3NpdGUgUmVmYWN0b3Jpbmc8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21wb3NpdGVSZWZhY3RvcmluZ0ltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSZWZhY3RvcmluZygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBDT01QT1NJVEVfUkVGQUNUT1JJTkcgPSAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT01QT1NJVEVfUkVGQUNUT1JJTkdfX05BTUUgPSBNT0RFTF9SRUZBQ1RPUklOR19fTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENPTVBPU0lURV9SRUZBQ1RPUklOR19fREVTQ1JJUFRJT04gPSBNT0RFTF9SRUZBQ1RPUklOR19fREVTQ1JJUFRJT047DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19SRUZfSUQgPSBNT0RFTF9SRUZBQ1RPUklOR19fUkVGX0lEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19MQUJFTCA9IE1PREVMX1JFRkFDVE9SSU5HX19MQUJFTDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19OQU1FU1BBQ0VfVVJJID0gTU9ERUxfUkVGQUNUT1JJTkdfX05BTUVTUEFDRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENPTVBPU0lURV9SRUZBQ1RPUklOR19fSU5QVVRfUE9SVFMgPSBNT0RFTF9SRUZBQ1RPUklOR19fSU5QVVRfUE9SVFM7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBSZWZhY3RvcmluZyBVbml0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQgPSBNT0RFTF9SRUZBQ1RPUklOR19GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT01QT1NJVEVfUkVGQUNUT1JJTkdfX1BPUlRfTUFQUElOR1MgPSBNT0RFTF9SRUZBQ1RPUklOR19GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2RlbCBSZWZhY3RvcmluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENPTVBPU0lURV9SRUZBQ1RPUklOR19fTU9ERUxfUkVGQUNUT1JJTkdTID0gTU9ERUxfUkVGQUNUT1JJTkdfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT01QT1NJVEVfUkVGQUNUT1JJTkdfX0hFTFBFUiA9IE1PREVMX1JFRkFDVE9SSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBpbmcgVmlzdWFsaXphdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENPTVBPU0lURV9SRUZBQ1RPUklOR19fTUFQUElOR19WSVNVQUxJWkFUSU9OID0gTU9ERUxfUkVGQUNUT1JJTkdfRkVBVFVSRV9DT1VOVCArIDQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9tIEluaXRpYWwgQ29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fSU5JVElBTF9DT05ESVRJT04gPSBNT0RFTF9SRUZBQ1RPUklOR19GRUFUVVJFX0NPVU5UICsgNTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b20gRmluYWwgQ29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fRklOQUxfQ09ORElUSU9OID0gTU9ERUxfUkVGQUNUT1JJTkdfRkVBVFVSRV9DT1VOVCArIDY7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcG9zaXRlIFJlZmFjdG9yaW5nPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENPTVBPU0lURV9SRUZBQ1RPUklOR19GRUFUVVJFX0NPVU5UID0gTU9ERUxfUkVGQUNUT1JJTkdfRkVBVFVSRV9DT1VOVCArIDc7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5EZXNjcmliZWRFbGVtZW50IDxlbT5EZXNjcmliZWQgRWxlbWVudDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5EZXNjcmliZWRFbGVtZW50DQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0RGVzY3JpYmVkRWxlbWVudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBERVNDUklCRURfRUxFTUVOVCA9IDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBERVNDUklCRURfRUxFTUVOVF9fREVTQ1JJUFRJT04gPSAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaWJlZCBFbGVtZW50PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IERFU0NSSUJFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSAxOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5SZWZhY3RvcmluZ1VuaXRJbXBsIDxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuUmVmYWN0b3JpbmdVbml0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFJlZmFjdG9yaW5nVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBSRUZBQ1RPUklOR19VTklUID0gMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUkVGQUNUT1JJTkdfVU5JVF9fTkFNRSA9IE5BTUVEX0VMRU1FTlRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFJFRkFDVE9SSU5HX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVIgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlZmFjdG9yaW5nIFVuaXQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUkVGQUNUT1JJTkdfVU5JVF9GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuQXRvbWljVW5pdEltcGwgPGVtPkF0b21pYyBVbml0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuQXRvbWljVW5pdEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRBdG9taWNVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IEFUT01JQ19VTklUID0gNTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQVRPTUlDX1VOSVRfX05BTUUgPSBSRUZBQ1RPUklOR19VTklUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcSBFeGVjdXRpb24gT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBBVE9NSUNfVU5JVF9fU0VRX0VYRUNVVElPTl9PUkRFUiA9IFJFRkFDVE9SSU5HX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFUT01JQ19VTklUX19JTlBVVF9QT1JUUyA9IFJFRkFDVE9SSU5HX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pdCBJZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFUT01JQ19VTklUX19VTklUX0lEID0gUkVGQUNUT1JJTkdfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFUT01JQ19VTklUX19MQUJFTCA9IFJFRkFDVE9SSU5HX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEFUT01JQ19VTklUX19OQU1FU1BBQ0VfVVJJID0gUkVGQUNUT1JJTkdfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQVRPTUlDX1VOSVRfX1RZUEUgPSBSRUZBQ1RPUklOR19VTklUX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGVsIFJlZmFjdG9yaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQVRPTUlDX1VOSVRfX01PREVMX1JFRkFDVE9SSU5HID0gUkVGQUNUT1JJTkdfVU5JVF9GRUFUVVJFX0NPVU5UICsgNTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVjayBJbml0aWFsIENvbmRpdGlvbiBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQVRPTUlDX1VOSVRfX0NIRUNLX0lOSVRJQUxfQ09ORElUSU9OX0ZMQUcgPSBSRUZBQ1RPUklOR19VTklUX0ZFQVRVUkVfQ09VTlQgKyA2Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrIEZpbmFsIENvbmRpdGlvbiBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQVRPTUlDX1VOSVRfX0NIRUNLX0ZJTkFMX0NPTkRJVElPTl9GTEFHID0gUkVGQUNUT1JJTkdfVU5JVF9GRUFUVVJFX0NPVU5UICsgNzsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BdG9taWMgVW5pdDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBBVE9NSUNfVU5JVF9GRUFUVVJFX0NPVU5UID0gUkVGQUNUT1JJTkdfVU5JVF9GRUFUVVJFX0NPVU5UICsgODsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuQ29tcG9zaXRlVW5pdEltcGwgPGVtPkNvbXBvc2l0ZSBVbml0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcG9zaXRlVW5pdEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IENPTVBPU0lURV9VTklUID0gNjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1VOSVRfX05BTUUgPSBSRUZBQ1RPUklOR19VTklUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcSBFeGVjdXRpb24gT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT01QT1NJVEVfVU5JVF9fU0VRX0VYRUNVVElPTl9PUkRFUiA9IFJFRkFDVE9SSU5HX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVI7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29tcG9zaXRlIFVuaXQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09NUE9TSVRFX1VOSVRfRkVBVFVSRV9DT1VOVCA9IFJFRkFDVE9SSU5HX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlNlcXVlbnRpYWxVbml0SW1wbCA8ZW0+U2VxdWVudGlhbCBVbml0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuU2VxdWVudGlhbFVuaXRJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0U2VxdWVudGlhbFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0VRVUVOVElBTF9VTklUID0gNzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VRVUVOVElBTF9VTklUX19OQU1FID0gQ09NUE9TSVRFX1VOSVRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFUVVFTlRJQUxfVU5JVF9fU0VRX0VYRUNVVElPTl9PUkRFUiA9IENPTVBPU0lURV9VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VRVUVOVElBTF9VTklUX19IRUxQRVJfVU5JVFMgPSBDT01QT1NJVEVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZhY3RvcmluZyBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VRVUVOVElBTF9VTklUX19SRUZBQ1RPUklOR19VTklUUyA9IENPTVBPU0lURV9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRVFVRU5USUFMX1VOSVRfX0lOUFVUX1BPUlRTID0gQ09NUE9TSVRFX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VRVUVOVElBTF9VTklUX19TVFJJQ1QgPSBDT01QT1NJVEVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0VRVUVOVElBTF9VTklUX19UWVBFID0gQ09NUE9TSVRFX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGJsIFN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNFUVVFTlRJQUxfVU5JVF9fTEJMX1NUUklDVCA9IENPTVBPU0lURV9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlcXVlbnRpYWwgVW5pdDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTRVFVRU5USUFMX1VOSVRfRkVBVFVSRV9DT1VOVCA9IENPTVBPU0lURV9VTklUX0ZFQVRVUkVfQ09VTlQgKyA2Ow0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5Db25kaXRpb25DaGVja0ltcGwgPGVtPkNvbmRpdGlvbiBDaGVjazwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbmRpdGlvbkNoZWNrSW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldENvbmRpdGlvbkNoZWNrKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IENPTkRJVElPTl9DSEVDSyA9IDg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENPTkRJVElPTl9DSEVDS19fTkFNRSA9IE5BTUVEX0VMRU1FTlRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT05ESVRJT05fQ0hFQ0tfX0RFU0NSSVBUSU9OID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09ORElUSU9OX0NIRUNLX19UWVBFID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09ORElUSU9OX0NIRUNLX19TUEVDID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25kaXRpb24gQ2hlY2s8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09ORElUSU9OX0NIRUNLX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5Db25kaXRpb25hbFVuaXRJbXBsIDxlbT5Db25kaXRpb25hbCBVbml0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29uZGl0aW9uYWxVbml0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldENvbmRpdGlvbmFsVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBDT05ESVRJT05BTF9VTklUID0gOTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09ORElUSU9OQUxfVU5JVF9fTkFNRSA9IENPTVBPU0lURV9VTklUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcSBFeGVjdXRpb24gT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT05ESVRJT05BTF9VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSID0gQ09NUE9TSVRFX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT05ESVRJT05BTF9VTklUX19JRiA9IENPTVBPU0lURV9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09ORElUSU9OQUxfVU5JVF9fSEVMUEVSX1VOSVRTID0gQ09NUE9TSVRFX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGhlbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENPTkRJVElPTkFMX1VOSVRfX1RIRU4gPSBDT01QT1NJVEVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbHNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ09ORElUSU9OQUxfVU5JVF9fRUxTRSA9IENPTVBPU0lURV9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT05ESVRJT05BTF9VTklUX19JTlBVVF9QT1JUUyA9IENPTVBPU0lURV9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT05ESVRJT05BTF9VTklUX19UWVBFID0gQ09NUE9TSVRFX1VOSVRfRkVBVFVSRV9DT1VOVCArIDU7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uZGl0aW9uYWwgVW5pdDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDT05ESVRJT05BTF9VTklUX0ZFQVRVUkVfQ09VTlQgPSBDT01QT1NJVEVfVU5JVF9GRUFUVVJFX0NPVU5UICsgNjsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuUXVldWVkVW5pdEltcGwgPGVtPlF1ZXVlZCBVbml0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuUXVldWVkVW5pdEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRRdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IFFVRVVFRF9VTklUID0gMTA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFFVRVVFRF9VTklUX19OQU1FID0gQ09NUE9TSVRFX1VOSVRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFFVRVVFRF9VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSID0gQ09NUE9TSVRFX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUVVFVUVEX1VOSVRfX1NUUklDVCA9IENPTVBPU0lURV9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlF1ZXVlZCBVbml0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFFVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgPSBDT01QT1NJVEVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlUXVldWVkVW5pdEltcGwgPGVtPlNpbmdsZSBRdWV1ZWQgVW5pdDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZVF1ZXVlZFVuaXRJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0U2luZ2xlUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBTSU5HTEVfUVVFVUVEX1VOSVQgPSAxMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX1FVRVVFRF9VTklUX19OQU1FID0gUVVFVUVEX1VOSVRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9RVUVVRURfVU5JVF9fU0VRX0VYRUNVVElPTl9PUkRFUiA9IFFVRVVFRF9VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9RVUVVRURfVU5JVF9fU1RSSUNUID0gUVVFVUVEX1VOSVRfX1NUUklDVDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTID0gUVVFVUVEX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmYWN0b3JpbmcgVW5pdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCA9IFFVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpbmdsZSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFMgPSBRVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aSBJbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUID0gUVVFVUVEX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9RVUVVRURfVU5JVF9fVFlQRSA9IFFVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxibCBTdHJpY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QgPSBRVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UICsgNTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW5nbGUgUXVldWVkIFVuaXQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgPSBRVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UICsgNjsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuVHdpY2VkUXVldWVkVW5pdEltcGwgPGVtPlR3aWNlZCBRdWV1ZWQgVW5pdDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLlR3aWNlZFF1ZXVlZFVuaXRJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0VHdpY2VkUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBUV0lDRURfUVVFVUVEX1VOSVQgPSAxMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgVFdJQ0VEX1FVRVVFRF9VTklUX19OQU1FID0gUVVFVUVEX1VOSVRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFRXSUNFRF9RVUVVRURfVU5JVF9fU0VRX0VYRUNVVElPTl9PUkRFUiA9IFFVRVVFRF9VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFRXSUNFRF9RVUVVRURfVU5JVF9fU1RSSUNUID0gUVVFVUVEX1VOSVRfX1NUUklDVDsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ud2ljZWQgUXVldWVkIFVuaXQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgVFdJQ0VEX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgPSBRVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuQ2FydGVzaWFuUXVldWVkVW5pdEltcGwgPGVtPkNhcnRlc2lhbiBRdWV1ZWQgVW5pdDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNhcnRlc2lhblF1ZXVlZFVuaXRJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBDQVJURVNJQU5fUVVFVUVEX1VOSVQgPSAxMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19OQU1FID0gVFdJQ0VEX1FVRVVFRF9VTklUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcSBFeGVjdXRpb24gT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDQVJURVNJQU5fUVVFVUVEX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVIgPSBUV0lDRURfUVVFVUVEX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19TVFJJQ1QgPSBUV0lDRURfUVVFVUVEX1VOSVRfX1NUUklDVDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENBUlRFU0lBTl9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTID0gVFdJQ0VEX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmFjdG9yaW5nIFVuaXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDQVJURVNJQU5fUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQgPSBUV0lDRURfUVVFVUVEX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2luZ2xlIElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDQVJURVNJQU5fUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUyA9IFRXSUNFRF9RVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUyA9IFRXSUNFRF9RVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19UWVBFID0gVFdJQ0VEX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxibCBTdHJpY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBDQVJURVNJQU5fUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QgPSBUV0lDRURfUVVFVUVEX1VOSVRfRkVBVFVSRV9DT1VOVCArIDU7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FydGVzaWFuIFF1ZXVlZCBVbml0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IENBUlRFU0lBTl9RVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UID0gVFdJQ0VEX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA2Ow0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5QYXJhbGxlbFF1ZXVlZFVuaXRJbXBsIDxlbT5QYXJhbGxlbCBRdWV1ZWQgVW5pdDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLlBhcmFsbGVsUXVldWVkVW5pdEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgUEFSQUxMRUxfUVVFVUVEX1VOSVQgPSAxNDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUEFSQUxMRUxfUVVFVUVEX1VOSVRfX05BTUUgPSBUV0lDRURfUVVFVUVEX1VOSVRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBBUkFMTEVMX1FVRVVFRF9VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSID0gVFdJQ0VEX1FVRVVFRF9VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBBUkFMTEVMX1FVRVVFRF9VTklUX19TVFJJQ1QgPSBUV0lDRURfUVVFVUVEX1VOSVRfX1NUUklDVDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMgPSBUV0lDRURfUVVFVUVEX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmYWN0b3JpbmcgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMgPSBUV0lDRURfUVVFVUVEX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2luZ2xlIElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQQVJBTExFTF9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTID0gVFdJQ0VEX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11bHRpIElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQQVJBTExFTF9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVFMgPSBUV0lDRURfUVVFVUVEX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBBUkFMTEVMX1FVRVVFRF9VTklUX19UWVBFID0gVFdJQ0VEX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxibCBTdHJpY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQQVJBTExFTF9RVUVVRURfVU5JVF9fTEJMX1NUUklDVCA9IFRXSUNFRF9RVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UICsgNTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYXJhbGxlbCBRdWV1ZWQgVW5pdDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQQVJBTExFTF9RVUVVRURfVU5JVF9GRUFUVVJFX0NPVU5UID0gVFdJQ0VEX1FVRVVFRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA2Ow0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5IZWxwZXJVbml0SW1wbCA8ZW0+SGVscGVyIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5IZWxwZXJVbml0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldEhlbHBlclVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgSEVMUEVSX1VOSVQgPSAxNTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgSEVMUEVSX1VOSVRfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgSEVMUEVSX1VOSVRfX0RFU0NSSVBUSU9OID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdCBJZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEhFTFBFUl9VTklUX19IRUxQRVJfVU5JVF9JRCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEhFTFBFUl9VTklUX19OQU1FU1BBQ0VfVVJJID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5IZWxwZXIgVW5pdDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBIRUxQRVJfVU5JVF9GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuRmVhdHVyZVVuaXRJbXBsIDxlbT5GZWF0dXJlIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5GZWF0dXJlVW5pdEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRGZWF0dXJlVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBGRUFUVVJFX1VOSVQgPSAxNjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRkVBVFVSRV9VTklUX19OQU1FID0gSEVMUEVSX1VOSVRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGRUFUVVJFX1VOSVRfX0RFU0NSSVBUSU9OID0gSEVMUEVSX1VOSVRfX0RFU0NSSVBUSU9OOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0IElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRkVBVFVSRV9VTklUX19IRUxQRVJfVU5JVF9JRCA9IEhFTFBFUl9VTklUX19IRUxQRVJfVU5JVF9JRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRkVBVFVSRV9VTklUX19OQU1FU1BBQ0VfVVJJID0gSEVMUEVSX1VOSVRfX05BTUVTUEFDRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmVhdHVyZSBVbml0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UID0gSEVMUEVSX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVVbml0SW1wbCA8ZW0+U2luZ2xlIEZlYXR1cmUgVW5pdDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVVbml0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZUZlYXR1cmVVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX1VOSVQgPSAxNzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZFQVRVUkVfVU5JVF9fTkFNRSA9IEZFQVRVUkVfVU5JVF9fTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX1VOSVRfX0RFU0NSSVBUSU9OID0gRkVBVFVSRV9VTklUX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdCBJZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX1VOSVRfX0hFTFBFUl9VTklUX0lEID0gRkVBVFVSRV9VTklUX19IRUxQRVJfVU5JVF9JRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZFQVRVUkVfVU5JVF9fTkFNRVNQQUNFX1VSSSA9IEZFQVRVUkVfVU5JVF9fTkFNRVNQQUNFX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVCA9IEZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUyA9IEZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUID0gRkVBVFVSRV9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpbmdsZSBGZWF0dXJlIEhlbHBlcjwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX1VOSVRfX1NJTkdMRV9GRUFUVVJFX0hFTFBFUiA9IEZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZFQVRVUkVfVU5JVF9fVFlQRSA9IEZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW5nbGUgRmVhdHVyZSBVbml0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX1VOSVRfRkVBVFVSRV9DT1VOVCA9IEZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UICsgNTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuTXVsdGlGZWF0dXJlVW5pdEltcGwgPGVtPk11bHRpIEZlYXR1cmUgVW5pdDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLk11bHRpRmVhdHVyZVVuaXRJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0TXVsdGlGZWF0dXJlVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX1VOSVQgPSAxODsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRkVBVFVSRV9VTklUX19OQU1FID0gRkVBVFVSRV9VTklUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRkVBVFVSRV9VTklUX19ERVNDUklQVElPTiA9IEZFQVRVUkVfVU5JVF9fREVTQ1JJUFRJT047DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIFVuaXQgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX1VOSVRfX0hFTFBFUl9VTklUX0lEID0gRkVBVFVSRV9VTklUX19IRUxQRVJfVU5JVF9JRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRkVBVFVSRV9VTklUX19OQU1FU1BBQ0VfVVJJID0gRkVBVFVSRV9VTklUX19OQU1FU1BBQ0VfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQgPSBGRUFUVVJFX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUyA9IEZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQgPSBGRUFUVVJFX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGkgRmVhdHVyZSBIZWxwZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX1VOSVRfX01VTFRJX0ZFQVRVUkVfSEVMUEVSID0gRkVBVFVSRV9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX1VOSVRfX1RZUEUgPSBGRUFUVVJFX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TXVsdGkgRmVhdHVyZSBVbml0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfVU5JVF9GRUFUVVJFX0NPVU5UID0gRkVBVFVSRV9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5GaWx0ZXJVbml0SW1wbCA8ZW0+RmlsdGVyIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5GaWx0ZXJVbml0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldEZpbHRlclVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgRklMVEVSX1VOSVQgPSAxOTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRklMVEVSX1VOSVRfX05BTUUgPSBIRUxQRVJfVU5JVF9fTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZJTFRFUl9VTklUX19ERVNDUklQVElPTiA9IEhFTFBFUl9VTklUX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdCBJZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZJTFRFUl9VTklUX19IRUxQRVJfVU5JVF9JRCA9IEhFTFBFUl9VTklUX19IRUxQRVJfVU5JVF9JRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRklMVEVSX1VOSVRfX05BTUVTUEFDRV9VUkkgPSBIRUxQRVJfVU5JVF9fTkFNRVNQQUNFX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5GaWx0ZXIgVW5pdDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGSUxURVJfVU5JVF9GRUFUVVJFX0NPVU5UID0gSEVMUEVSX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZpbHRlclVuaXRJbXBsIDxlbT5TaW5nbGUgRmlsdGVyIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5TaW5nbGVGaWx0ZXJVbml0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZUZpbHRlclVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9VTklUID0gMjA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GSUxURVJfVU5JVF9fTkFNRSA9IEZJTFRFUl9VTklUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9VTklUX19ERVNDUklQVElPTiA9IEZJTFRFUl9VTklUX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdCBJZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GSUxURVJfVU5JVF9fSEVMUEVSX1VOSVRfSUQgPSBGSUxURVJfVU5JVF9fSEVMUEVSX1VOSVRfSUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GSUxURVJfVU5JVF9fTkFNRVNQQUNFX1VSSSA9IEZJTFRFUl9VTklUX19OQU1FU1BBQ0VfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQgPSBGSUxURVJfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GSUxURVJfVU5JVF9fT1VUUFVUX1BPUlQgPSBGSUxURVJfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GSUxURVJfVU5JVF9fU0lOR0xFX0ZJTFRFUl9IRUxQRVIgPSBGSUxURVJfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9VTklUX19UWVBFID0gRklMVEVSX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2luZ2xlIEZpbHRlciBVbml0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GSUxURVJfVU5JVF9GRUFUVVJFX0NPVU5UID0gRklMVEVSX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpRmlsdGVyVW5pdEltcGwgPGVtPk11bHRpIEZpbHRlciBVbml0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuTXVsdGlGaWx0ZXJVbml0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpRmlsdGVyVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBNVUxUSV9GSUxURVJfVU5JVCA9IDIxOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GSUxURVJfVU5JVF9fTkFNRSA9IEZJTFRFUl9VTklUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRklMVEVSX1VOSVRfX0RFU0NSSVBUSU9OID0gRklMVEVSX1VOSVRfX0RFU0NSSVBUSU9OOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0IElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRklMVEVSX1VOSVRfX0hFTFBFUl9VTklUX0lEID0gRklMVEVSX1VOSVRfX0hFTFBFUl9VTklUX0lEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GSUxURVJfVU5JVF9fTkFNRVNQQUNFX1VSSSA9IEZJTFRFUl9VTklUX19OQU1FU1BBQ0VfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVCA9IEZJTFRFUl9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUID0gRklMVEVSX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGkgRmlsdGVyIEhlbHBlcjwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZJTFRFUl9VTklUX19NVUxUSV9GSUxURVJfSEVMUEVSID0gRklMVEVSX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZJTFRFUl9VTklUX19UWVBFID0gRklMVEVSX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TXVsdGkgRmlsdGVyIFVuaXQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRklMVEVSX1VOSVRfRkVBVFVSRV9DT1VOVCA9IEZJTFRFUl9VTklUX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5IZWxwZXJJbXBsIDxlbT5IZWxwZXI8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5IZWxwZXJJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0SGVscGVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IEhFTFBFUiA9IDIyOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBIRUxQRVJfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgSEVMUEVSX19ERVNDUklQVElPTiA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgSEVMUEVSX19IRUxQRVJfSUQgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBIRUxQRVJfX05BTUVTUEFDRV9VUkkgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkhlbHBlcjwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBIRUxQRVJfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLkZlYXR1cmVIZWxwZXJJbXBsIDxlbT5GZWF0dXJlIEhlbHBlcjwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkZlYXR1cmVIZWxwZXJJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0RmVhdHVyZUhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBGRUFUVVJFX0hFTFBFUiA9IDIzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGRUFUVVJFX0hFTFBFUl9fTkFNRSA9IEhFTFBFUl9fTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZFQVRVUkVfSEVMUEVSX19ERVNDUklQVElPTiA9IEhFTFBFUl9fREVTQ1JJUFRJT047DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRkVBVFVSRV9IRUxQRVJfX0hFTFBFUl9JRCA9IEhFTFBFUl9fSEVMUEVSX0lEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGRUFUVVJFX0hFTFBFUl9fTkFNRVNQQUNFX1VSSSA9IEhFTFBFUl9fTkFNRVNQQUNFX1VSSTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRkVBVFVSRV9IRUxQRVJfX0lOUFVUX1BPUlQgPSBIRUxQRVJfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTID0gSEVMUEVSX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZlYXR1cmUgSGVscGVyPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZFQVRVUkVfSEVMUEVSX0ZFQVRVUkVfQ09VTlQgPSBIRUxQRVJfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVIZWxwZXJJbXBsIDxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5TaW5nbGVGZWF0dXJlSGVscGVySW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZUZlYXR1cmVIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZFQVRVUkVfSEVMUEVSID0gMjQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fTkFNRSA9IEZFQVRVUkVfSEVMUEVSX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZFQVRVUkVfSEVMUEVSX19ERVNDUklQVElPTiA9IEZFQVRVUkVfSEVMUEVSX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfRkVBVFVSRV9IRUxQRVJfX0hFTFBFUl9JRCA9IEZFQVRVUkVfSEVMUEVSX19IRUxQRVJfSUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fTkFNRVNQQUNFX1VSSSA9IEZFQVRVUkVfSEVMUEVSX19OQU1FU1BBQ0VfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfRkVBVFVSRV9IRUxQRVJfX0lOUFVUX1BPUlQgPSBGRUFUVVJFX0hFTFBFUl9fSU5QVVRfUE9SVDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTID0gRkVBVFVSRV9IRUxQRVJfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQgPSBGRUFUVVJFX0hFTFBFUl9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZFQVRVUkVfSEVMUEVSX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX0hFTFBFUl9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuTXVsdGlGZWF0dXJlSGVscGVySW1wbCA8ZW0+TXVsdGkgRmVhdHVyZSBIZWxwZXI8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5NdWx0aUZlYXR1cmVIZWxwZXJJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0TXVsdGlGZWF0dXJlSGVscGVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfSEVMUEVSID0gMjU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfSEVMUEVSX19OQU1FID0gRkVBVFVSRV9IRUxQRVJfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX0hFTFBFUl9fREVTQ1JJUFRJT04gPSBGRUFUVVJFX0hFTFBFUl9fREVTQ1JJUFRJT047DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRkVBVFVSRV9IRUxQRVJfX0hFTFBFUl9JRCA9IEZFQVRVUkVfSEVMUEVSX19IRUxQRVJfSUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfSEVMUEVSX19OQU1FU1BBQ0VfVVJJID0gRkVBVFVSRV9IRUxQRVJfX05BTUVTUEFDRV9VUkk7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfSEVMUEVSX19JTlBVVF9QT1JUID0gRkVBVFVSRV9IRUxQRVJfX0lOUFVUX1BPUlQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTID0gRkVBVFVSRV9IRUxQRVJfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVCA9IEZFQVRVUkVfSEVMUEVSX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk11bHRpIEZlYXR1cmUgSGVscGVyPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZFQVRVUkVfSEVMUEVSX0ZFQVRVUkVfQ09VTlQgPSBGRUFUVVJFX0hFTFBFUl9GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuRmlsdGVySGVscGVySW1wbCA8ZW0+RmlsdGVyIEhlbHBlcjwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkZpbHRlckhlbHBlckltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRGaWx0ZXJIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgRklMVEVSX0hFTFBFUiA9IDI2Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGSUxURVJfSEVMUEVSX19OQU1FID0gSEVMUEVSX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRklMVEVSX0hFTFBFUl9fREVTQ1JJUFRJT04gPSBIRUxQRVJfX0RFU0NSSVBUSU9OOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBJZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IEZJTFRFUl9IRUxQRVJfX0hFTFBFUl9JRCA9IEhFTFBFUl9fSEVMUEVSX0lEOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGSUxURVJfSEVMUEVSX19OQU1FU1BBQ0VfVVJJID0gSEVMUEVSX19OQU1FU1BBQ0VfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBGSUxURVJfSEVMUEVSX19JTlBVVF9QT1JUID0gSEVMUEVSX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpbHRlciBIZWxwZXI8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgRklMVEVSX0hFTFBFUl9GRUFUVVJFX0NPVU5UID0gSEVMUEVSX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5TaW5nbGVGaWx0ZXJIZWxwZXJJbXBsIDxlbT5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZUZpbHRlckhlbHBlckltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9IRUxQRVIgPSAyNzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX05BTUUgPSBGSUxURVJfSEVMUEVSX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX0RFU0NSSVBUSU9OID0gRklMVEVSX0hFTFBFUl9fREVTQ1JJUFRJT047DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX0hFTFBFUl9JRCA9IEZJTFRFUl9IRUxQRVJfX0hFTFBFUl9JRDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX05BTUVTUEFDRV9VUkkgPSBGSUxURVJfSEVMUEVSX19OQU1FU1BBQ0VfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVCA9IEZJTFRFUl9IRUxQRVJfX0lOUFVUX1BPUlQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfRklMVEVSX0hFTFBFUl9fT1VUUFVUX1BPUlQgPSBGSUxURVJfSEVMUEVSX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9GSUxURVJfSEVMUEVSX0ZFQVRVUkVfQ09VTlQgPSBGSUxURVJfSEVMUEVSX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5NdWx0aUZpbHRlckhlbHBlckltcGwgPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5NdWx0aUZpbHRlckhlbHBlckltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRNdWx0aUZpbHRlckhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBNVUxUSV9GSUxURVJfSEVMUEVSID0gMjg7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZJTFRFUl9IRUxQRVJfX05BTUUgPSBGSUxURVJfSEVMUEVSX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfRklMVEVSX0hFTFBFUl9fREVTQ1JJUFRJT04gPSBGSUxURVJfSEVMUEVSX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GSUxURVJfSEVMUEVSX19IRUxQRVJfSUQgPSBGSUxURVJfSEVMUEVSX19IRUxQRVJfSUQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZJTFRFUl9IRUxQRVJfX05BTUVTUEFDRV9VUkkgPSBGSUxURVJfSEVMUEVSX19OQU1FU1BBQ0VfVVJJOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9GSUxURVJfSEVMUEVSX19JTlBVVF9QT1JUID0gRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JUID0gRklMVEVSX0hFTFBFUl9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NdWx0aSBGaWx0ZXIgSGVscGVyPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0ZJTFRFUl9IRUxQRVJfRkVBVFVSRV9DT1VOVCA9IEZJTFRFUl9IRUxQRVJfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlBvcnRJbXBsIDxlbT5Qb3J0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuUG9ydEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IFBPUlQgPSAyOTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9SVF9fTkFNRSA9IE5BTUVEX0VMRU1FTlRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBQT1JUX19ERVNDUklQVElPTiA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUlRfX1RZUEUgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgUE9SVF9GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlUG9ydEltcGwgPGVtPlNpbmdsZSBQb3J0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuU2luZ2xlUG9ydEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRTaW5nbGVQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9QT1JUID0gMzA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9QT1JUX19OQU1FID0gUE9SVF9fTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9QT1JUX19ERVNDUklQVElPTiA9IFBPUlRfX0RFU0NSSVBUSU9OOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfUE9SVF9fVFlQRSA9IFBPUlRfX1RZUEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfUE9SVF9fVkFMVUUgPSBQT1JUX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNpbmdsZSBQb3J0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9QT1JUX0ZFQVRVUkVfQ09VTlQgPSBQT1JUX0ZFQVRVUkVfQ09VTlQgKyAxOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5NdWx0aVBvcnRJbXBsIDxlbT5NdWx0aSBQb3J0PC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuTXVsdGlQb3J0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpUG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBNVUxUSV9QT1JUID0gMzE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX1BPUlRfX05BTUUgPSBQT1JUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfUE9SVF9fREVTQ1JJUFRJT04gPSBQT1JUX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfUE9SVF9fVFlQRSA9IFBPUlRfX1RZUEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX1BPUlRfX1ZBTFVFID0gUE9SVF9GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NdWx0aSBQb3J0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX1BPUlRfRkVBVFVSRV9DT1VOVCA9IFBPUlRfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLklucHV0UG9ydEltcGwgPGVtPklucHV0IFBvcnQ8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5JbnB1dFBvcnRJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0SW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IElOUFVUX1BPUlQgPSAzMjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgSU5QVVRfUE9SVF9fTkFNRSA9IFBPUlRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBJTlBVVF9QT1JUX19ERVNDUklQVElPTiA9IFBPUlRfX0RFU0NSSVBUSU9OOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBJTlBVVF9QT1JUX19UWVBFID0gUE9SVF9fVFlQRTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IElOUFVUX1BPUlRfRkVBVFVSRV9DT1VOVCA9IFBPUlRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk91dHB1dFBvcnRJbXBsIDxlbT5PdXRwdXQgUG9ydDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLk91dHB1dFBvcnRJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBPVVRQVVRfUE9SVCA9IDMzOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBPVVRQVVRfUE9SVF9fTkFNRSA9IFBPUlRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBPVVRQVVRfUE9SVF9fREVTQ1JJUFRJT04gPSBQT1JUX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgT1VUUFVUX1BPUlRfX1RZUEUgPSBQT1JUX19UWVBFOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE9VVFBVVF9QT1JUX0ZFQVRVUkVfQ09VTlQgPSBQT1JUX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5TaW5nbGVJbnB1dFBvcnRJbXBsIDxlbT5TaW5nbGUgSW5wdXQgUG9ydDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZUlucHV0UG9ydEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRTaW5nbGVJbnB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0lOUFVUX1BPUlQgPSAzNDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0lOUFVUX1BPUlRfX05BTUUgPSBTSU5HTEVfUE9SVF9fTkFNRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9JTlBVVF9QT1JUX19ERVNDUklQVElPTiA9IFNJTkdMRV9QT1JUX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX0lOUFVUX1BPUlRfX1RZUEUgPSBTSU5HTEVfUE9SVF9fVFlQRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9JTlBVVF9QT1JUX19WQUxVRSA9IFNJTkdMRV9QT1JUX19WQUxVRTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TaW5nbGUgSW5wdXQgUG9ydDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfSU5QVVRfUE9SVF9GRUFUVVJFX0NPVU5UID0gU0lOR0xFX1BPUlRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpSW5wdXRQb3J0SW1wbCA8ZW0+TXVsdGkgSW5wdXQgUG9ydDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLk11bHRpSW5wdXRQb3J0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpSW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IE1VTFRJX0lOUFVUX1BPUlQgPSAzNTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfSU5QVVRfUE9SVF9fTkFNRSA9IE1VTFRJX1BPUlRfX05BTUU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9JTlBVVF9QT1JUX19ERVNDUklQVElPTiA9IE1VTFRJX1BPUlRfX0RFU0NSSVBUSU9OOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBNVUxUSV9JTlBVVF9QT1JUX19UWVBFID0gTVVMVElfUE9SVF9fVFlQRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfSU5QVVRfUE9SVF9fVkFMVUUgPSBNVUxUSV9QT1JUX19WQUxVRTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX0lOUFVUX1BPUlRfRkVBVFVSRV9DT1VOVCA9IE1VTFRJX1BPUlRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZU91dHB1dFBvcnRJbXBsIDxlbT5TaW5nbGUgT3V0cHV0IFBvcnQ8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5TaW5nbGVPdXRwdXRQb3J0SW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZU91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX09VVFBVVF9QT1JUID0gMzY7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9PVVRQVVRfUE9SVF9fTkFNRSA9IFNJTkdMRV9QT1JUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX09VVFBVVF9QT1JUX19ERVNDUklQVElPTiA9IFNJTkdMRV9QT1JUX19ERVNDUklQVElPTjsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX09VVFBVVF9QT1JUX19UWVBFID0gU0lOR0xFX1BPUlRfX1RZUEU7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfT1VUUFVUX1BPUlRfX1ZBTFVFID0gU0lOR0xFX1BPUlRfX1ZBTFVFOw0KKw0KKwkvKioNCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNpbmdsZSBPdXRwdXQgUG9ydDwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfT1VUUFVUX1BPUlRfRkVBVFVSRV9DT1VOVCA9IFNJTkdMRV9QT1JUX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5NdWx0aU91dHB1dFBvcnRJbXBsIDxlbT5NdWx0aSBPdXRwdXQgUG9ydDwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLk11bHRpT3V0cHV0UG9ydEltcGwNCisJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRNdWx0aU91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgTVVMVElfT1VUUFVUX1BPUlQgPSAzNzsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfT1VUUFVUX1BPUlRfX05BTUUgPSBNVUxUSV9QT1JUX19OQU1FOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfT1VUUFVUX1BPUlRfX0RFU0NSSVBUSU9OID0gTVVMVElfUE9SVF9fREVTQ1JJUFRJT047DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX09VVFBVVF9QT1JUX19UWVBFID0gTVVMVElfUE9SVF9fVFlQRTsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfT1VUUFVUX1BPUlRfX1ZBTFVFID0gTVVMVElfUE9SVF9fVkFMVUU7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TXVsdGkgT3V0cHV0IFBvcnQ8L2VtPicgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfT1VUUFVUX1BPUlRfRkVBVFVSRV9DT1VOVCA9IE1VTFRJX1BPUlRfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlBvcnRNYXBwaW5nSW1wbCA8ZW0+UG9ydCBNYXBwaW5nPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuUG9ydE1hcHBpbmdJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0UG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgUE9SVF9NQVBQSU5HID0gMzg7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFBPUlRfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMDsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlUG9ydE1hcHBpbmdJbXBsIDxlbT5TaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT59JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgY29tcmVsLmltcGwuU2luZ2xlUG9ydE1hcHBpbmdJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0U2luZ2xlUG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgU0lOR0xFX1BPUlRfTUFQUElORyA9IDM5Ow0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IFNJTkdMRV9QT1JUX01BUFBJTkdfX1NPVVJDRSA9IFBPUlRfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsNCisNCisJLyoqDQorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfUE9SVF9NQVBQSU5HX19UQVJHRVQgPSBQT1JUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2luZ2xlIFBvcnQgTWFwcGluZzwvZW0+JyBjbGFzcy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCWludCBTSU5HTEVfUE9SVF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBQT1JUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7DQorDQorCS8qKg0KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpUG9ydE1hcHBpbmdJbXBsIDxlbT5NdWx0aSBQb3J0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSBjb21yZWwuaW1wbC5NdWx0aVBvcnRNYXBwaW5nSW1wbA0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpUG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgTVVMVElfUE9SVF9NQVBQSU5HID0gNDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfUE9SVF9NQVBQSU5HX19TT1VSQ0UgPSBQT1JUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfUE9SVF9NQVBQSU5HX19UQVJHRVQgPSBQT1JUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7DQorDQorCS8qKg0KKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TXVsdGkgUG9ydCBNYXBwaW5nPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX1BPUlRfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gUE9SVF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOw0KKw0KKwkvKioNCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSW1wbCA8ZW0+TXVsdGkgU2luZ2xlIFBvcnQgTWFwcGluZzwvZW0+fScgY2xhc3MuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdJbXBsDQorCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludCBNVUxUSV9TSU5HTEVfUE9SVF9NQVBQSU5HID0gNDE7DQorDQorCS8qKg0KKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlpbnQgTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fU09VUkNFID0gUE9SVF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOw0KKw0KKwkvKioNCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkdfX1RBUkdFVCA9IFBPUlRfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsNCisNCisJLyoqDQorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NdWx0aSBTaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT4nIGNsYXNzLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJaW50IE1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFBPUlRfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsNCisNCisJLyoqDQorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLk1hcHBpbmdWaXN1YWxpemF0aW9uIDxlbT5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2VtPn0nIGVudW0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlIGNvbXJlbC5NYXBwaW5nVmlzdWFsaXphdGlvbg0KKwkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJaW50IE1BUFBJTkdfVklTVUFMSVpBVElPTiA9IDQyOw0KKw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nIDxlbT5Db21wb3NpdGUgUmVmYWN0b3Jpbmc8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJlZmFjdG9yaW5nPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldE1haW5SZWZhY3RvcmluZ1VuaXQgPGVtPk1haW4gUmVmYWN0b3JpbmcgVW5pdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1haW4gUmVmYWN0b3JpbmcgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcjZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpDQorCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJlZmFjdG9yaW5nKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19NYWluUmVmYWN0b3JpbmdVbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldFBvcnRNYXBwaW5ncyA8ZW0+UG9ydCBNYXBwaW5nczwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UG9ydCBNYXBwaW5nczwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcjZ2V0UG9ydE1hcHBpbmdzKCkNCisJICogQHNlZSAjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX1BvcnRNYXBwaW5ncygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyNnZXRNb2RlbFJlZmFjdG9yaW5ncyA8ZW0+TW9kZWwgUmVmYWN0b3JpbmdzPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2RlbCBSZWZhY3RvcmluZ3M8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldE1vZGVsUmVmYWN0b3JpbmdzKCkNCisJICogQHNlZSAjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX01vZGVsUmVmYWN0b3JpbmdzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldEhlbHBlciA8ZW0+SGVscGVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IZWxwZXI8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldEhlbHBlcigpDQorCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJlZmFjdG9yaW5nKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19IZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uIDxlbT5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uKCkNCisJICogQHNlZSAjZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX01hcHBpbmdWaXN1YWxpemF0aW9uKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyNnZXRDdXN0b21Jbml0aWFsQ29uZGl0aW9uIDxlbT5DdXN0b20gSW5pdGlhbCBDb25kaXRpb248L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXN0b20gSW5pdGlhbCBDb25kaXRpb248L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nI2dldEN1c3RvbUluaXRpYWxDb25kaXRpb24oKQ0KKwkgKiBAc2VlICNnZXRDb21wb3NpdGVSZWZhY3RvcmluZygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfQ3VzdG9tSW5pdGlhbENvbmRpdGlvbigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3JpbmcjZ2V0Q3VzdG9tRmluYWxDb25kaXRpb24gPGVtPkN1c3RvbSBGaW5hbCBDb25kaXRpb248L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXN0b20gRmluYWwgQ29uZGl0aW9uPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyNnZXRDdXN0b21GaW5hbENvbmRpdGlvbigpDQorCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJlZmFjdG9yaW5nKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19DdXN0b21GaW5hbENvbmRpdGlvbigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5OYW1lZEVsZW1lbnQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5OYW1lZEVsZW1lbnQjZ2V0TmFtZSgpDQorCSAqIEBzZWUgI2dldE5hbWVkRWxlbWVudCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5EZXNjcmliZWRFbGVtZW50IDxlbT5EZXNjcmliZWQgRWxlbWVudDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmliZWQgRWxlbWVudDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuRGVzY3JpYmVkRWxlbWVudA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0RGVzY3JpYmVkRWxlbWVudCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuRGVzY3JpYmVkRWxlbWVudCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuRGVzY3JpYmVkRWxlbWVudCNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBzZWUgI2dldERlc2NyaWJlZEVsZW1lbnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldERlc2NyaWJlZEVsZW1lbnRfRGVzY3JpcHRpb24oKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQgPGVtPlJlZmFjdG9yaW5nIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuUmVmYWN0b3JpbmdVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLlJlZmFjdG9yaW5nVW5pdCNnZXRTZXFFeGVjdXRpb25PcmRlciA8ZW0+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcSBFeGVjdXRpb24gT3JkZXI8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlJlZmFjdG9yaW5nVW5pdCNnZXRTZXFFeGVjdXRpb25PcmRlcigpDQorCSAqIEBzZWUgI2dldFJlZmFjdG9yaW5nVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0UmVmYWN0b3JpbmdVbml0X1NlcUV4ZWN1dGlvbk9yZGVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuTW9kZWxSZWZhY3RvcmluZyA8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldE1vZGVsUmVmYWN0b3JpbmcoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0UmVmSWQgPGVtPlJlZiBJZDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZiBJZDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuTW9kZWxSZWZhY3RvcmluZyNnZXRSZWZJZCgpDQorCSAqIEBzZWUgI2dldE1vZGVsUmVmYWN0b3JpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldE1vZGVsUmVmYWN0b3JpbmdfUmVmSWQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFiZWw8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0TGFiZWwoKQ0KKwkgKiBAc2VlICNnZXRNb2RlbFJlZmFjdG9yaW5nKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRNb2RlbFJlZmFjdG9yaW5nX0xhYmVsKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nI2dldE5hbWVzcGFjZVVyaSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0TmFtZXNwYWNlVXJpKCkNCisJICogQHNlZSAjZ2V0TW9kZWxSZWZhY3RvcmluZygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0TW9kZWxSZWZhY3RvcmluZ19OYW1lc3BhY2VVcmkoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBjb21yZWwuTW9kZWxSZWZhY3RvcmluZyNnZXRJbnB1dFBvcnRzIDxlbT5JbnB1dCBQb3J0czwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW5wdXQgUG9ydHM8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0SW5wdXRQb3J0cygpDQorCSAqIEBzZWUgI2dldE1vZGVsUmVmYWN0b3JpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE1vZGVsUmVmYWN0b3JpbmdfSW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLkF0b21pY1VuaXQgPGVtPkF0b21pYyBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF0b21pYyBVbml0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5BdG9taWNVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRBdG9taWNVbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgY29tcmVsLkF0b21pY1VuaXQjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPklucHV0IFBvcnRzPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5BdG9taWNVbml0I2dldElucHV0UG9ydHMoKQ0KKwkgKiBAc2VlICNnZXRBdG9taWNVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRBdG9taWNVbml0X0lucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLkF0b21pY1VuaXQjZ2V0VW5pdElkIDxlbT5Vbml0IElkPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5pdCBJZDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQXRvbWljVW5pdCNnZXRVbml0SWQoKQ0KKwkgKiBAc2VlICNnZXRBdG9taWNVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRBdG9taWNVbml0X1VuaXRJZCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuQXRvbWljVW5pdCNnZXRMYWJlbCA8ZW0+TGFiZWw8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYWJlbDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQXRvbWljVW5pdCNnZXRMYWJlbCgpDQorCSAqIEBzZWUgI2dldEF0b21pY1VuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEF0b21pY1VuaXRfTGFiZWwoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLkF0b21pY1VuaXQjZ2V0TmFtZXNwYWNlVXJpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQXRvbWljVW5pdCNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAc2VlICNnZXRBdG9taWNVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRBdG9taWNVbml0X05hbWVzcGFjZVVyaSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuQXRvbWljVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQXRvbWljVW5pdCNnZXRUeXBlKCkNCisJICogQHNlZSAjZ2V0QXRvbWljVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0QXRvbWljVW5pdF9UeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5BdG9taWNVbml0I2dldE1vZGVsUmVmYWN0b3JpbmcgPGVtPk1vZGVsIFJlZmFjdG9yaW5nPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkF0b21pY1VuaXQjZ2V0TW9kZWxSZWZhY3RvcmluZygpDQorCSAqIEBzZWUgI2dldEF0b21pY1VuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldEF0b21pY1VuaXRfTW9kZWxSZWZhY3RvcmluZygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuQXRvbWljVW5pdCNpc0NoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcgPGVtPkNoZWNrIEluaXRpYWwgQ29uZGl0aW9uIEZsYWc8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DaGVjayBJbml0aWFsIENvbmRpdGlvbiBGbGFnPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5BdG9taWNVbml0I2lzQ2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZygpDQorCSAqIEBzZWUgI2dldEF0b21pY1VuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEF0b21pY1VuaXRfQ2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuQXRvbWljVW5pdCNpc0NoZWNrRmluYWxDb25kaXRpb25GbGFnIDxlbT5DaGVjayBGaW5hbCBDb25kaXRpb24gRmxhZzwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoZWNrIEZpbmFsIENvbmRpdGlvbiBGbGFnPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5BdG9taWNVbml0I2lzQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKQ0KKwkgKiBAc2VlICNnZXRBdG9taWNVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRBdG9taWNVbml0X0NoZWNrRmluYWxDb25kaXRpb25GbGFnKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuQ29tcG9zaXRlVW5pdCA8ZW0+Q29tcG9zaXRlIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkNvbXBvc2l0ZVVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldENvbXBvc2l0ZVVuaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5TZXF1ZW50aWFsVW5pdCA8ZW0+U2VxdWVudGlhbCBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcXVlbnRpYWwgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2VxdWVudGlhbFVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFNlcXVlbnRpYWxVbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgY29tcmVsLlNlcXVlbnRpYWxVbml0I2dldEhlbHBlclVuaXRzIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhlbHBlciBVbml0czwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0SGVscGVyVW5pdHMoKQ0KKwkgKiBAc2VlICNnZXRTZXF1ZW50aWFsVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0U2VxdWVudGlhbFVuaXRfSGVscGVyVW5pdHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0cyA8ZW0+UmVmYWN0b3JpbmcgVW5pdHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmFjdG9yaW5nIFVuaXRzPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TZXF1ZW50aWFsVW5pdCNnZXRSZWZhY3RvcmluZ1VuaXRzKCkNCisJICogQHNlZSAjZ2V0U2VxdWVudGlhbFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFNlcXVlbnRpYWxVbml0X1JlZmFjdG9yaW5nVW5pdHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPklucHV0IFBvcnRzPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TZXF1ZW50aWFsVW5pdCNnZXRJbnB1dFBvcnRzKCkNCisJICogQHNlZSAjZ2V0U2VxdWVudGlhbFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFNlcXVlbnRpYWxVbml0X0lucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLlNlcXVlbnRpYWxVbml0I2lzU3RyaWN0IDxlbT5TdHJpY3Q8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdHJpY3Q8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNlcXVlbnRpYWxVbml0I2lzU3RyaWN0KCkNCisJICogQHNlZSAjZ2V0U2VxdWVudGlhbFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFNlcXVlbnRpYWxVbml0X1N0cmljdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNlcXVlbnRpYWxVbml0I2dldFR5cGUoKQ0KKwkgKiBAc2VlICNnZXRTZXF1ZW50aWFsVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U2VxdWVudGlhbFVuaXRfVHlwZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGJsIFN0cmljdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0TGJsU3RyaWN0KCkNCisJICogQHNlZSAjZ2V0U2VxdWVudGlhbFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFNlcXVlbnRpYWxVbml0X0xibFN0cmljdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLkNvbmRpdGlvbkNoZWNrIDxlbT5Db25kaXRpb24gQ2hlY2s8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uZGl0aW9uIENoZWNrPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5Db25kaXRpb25DaGVjaw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0Q29uZGl0aW9uQ2hlY2soKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLkNvbmRpdGlvbkNoZWNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5Db25kaXRpb25DaGVjayNnZXRUeXBlKCkNCisJICogQHNlZSAjZ2V0Q29uZGl0aW9uQ2hlY2soKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldENvbmRpdGlvbkNoZWNrX1R5cGUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLkNvbmRpdGlvbkNoZWNrI2dldFNwZWMgPGVtPlNwZWM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TcGVjPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5Db25kaXRpb25DaGVjayNnZXRTcGVjKCkNCisJICogQHNlZSAjZ2V0Q29uZGl0aW9uQ2hlY2soKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldENvbmRpdGlvbkNoZWNrX1NwZWMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQgPGVtPkNvbmRpdGlvbmFsIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29uZGl0aW9uYWwgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ29uZGl0aW9uYWxVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRDb25kaXRpb25hbFVuaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLkNvbmRpdGlvbmFsVW5pdCNnZXRJZiA8ZW0+SWY8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JZjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldElmKCkNCisJICogQHNlZSAjZ2V0Q29uZGl0aW9uYWxVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDb25kaXRpb25hbFVuaXRfSWYoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldEhlbHBlclVuaXRzIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhlbHBlciBVbml0czwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldEhlbHBlclVuaXRzKCkNCisJICogQHNlZSAjZ2V0Q29uZGl0aW9uYWxVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDb25kaXRpb25hbFVuaXRfSGVscGVyVW5pdHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLkNvbmRpdGlvbmFsVW5pdCNnZXRUaGVuIDxlbT5UaGVuPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGhlbjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldFRoZW4oKQ0KKwkgKiBAc2VlICNnZXRDb25kaXRpb25hbFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldENvbmRpdGlvbmFsVW5pdF9UaGVuKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0RWxzZSA8ZW0+RWxzZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVsc2U8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkNvbmRpdGlvbmFsVW5pdCNnZXRFbHNlKCkNCisJICogQHNlZSAjZ2V0Q29uZGl0aW9uYWxVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDb25kaXRpb25hbFVuaXRfRWxzZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPklucHV0IFBvcnRzPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0SW5wdXRQb3J0cygpDQorCSAqIEBzZWUgI2dldENvbmRpdGlvbmFsVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0Q29uZGl0aW9uYWxVbml0X0lucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLkNvbmRpdGlvbmFsVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldFR5cGUoKQ0KKwkgKiBAc2VlICNnZXRDb25kaXRpb25hbFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldENvbmRpdGlvbmFsVW5pdF9UeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuUXVldWVkVW5pdCA8ZW0+UXVldWVkIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UXVldWVkIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlF1ZXVlZFVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFF1ZXVlZFVuaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLlF1ZXVlZFVuaXQjaXNTdHJpY3QgPGVtPlN0cmljdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0cmljdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuUXVldWVkVW5pdCNpc1N0cmljdCgpDQorCSAqIEBzZWUgI2dldFF1ZXVlZFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFF1ZXVlZFVuaXRfU3RyaWN0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlUXVldWVkVW5pdCA8ZW0+U2luZ2xlIFF1ZXVlZCBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNpbmdsZSBRdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlUXVldWVkVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0U2luZ2xlUXVldWVkVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0I2dldEhlbHBlclVuaXRzIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhlbHBlciBVbml0czwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlUXVldWVkVW5pdCNnZXRIZWxwZXJVbml0cygpDQorCSAqIEBzZWUgI2dldFNpbmdsZVF1ZXVlZFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0IDxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlUXVldWVkVW5pdCNnZXRSZWZhY3RvcmluZ1VuaXQoKQ0KKwkgKiBAc2VlICNnZXRTaW5nbGVRdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0I2dldFNpbmdsZUlucHV0UG9ydHMgPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0I2dldFNpbmdsZUlucHV0UG9ydHMoKQ0KKwkgKiBAc2VlICNnZXRTaW5nbGVRdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTaW5nbGVRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0TXVsdGlJbnB1dFBvcnQgPGVtPk11bHRpIElucHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0I2dldE11bHRpSW5wdXRQb3J0KCkNCisJICogQHNlZSAjZ2V0U2luZ2xlUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0U2luZ2xlUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuU2luZ2xlUXVldWVkVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlUXVldWVkVW5pdCNnZXRUeXBlKCkNCisJICogQHNlZSAjZ2V0U2luZ2xlUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U2luZ2xlUXVldWVkVW5pdF9UeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0I2dldExibFN0cmljdCA8ZW0+TGJsIFN0cmljdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxibCBTdHJpY3Q8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0KCkNCisJICogQHNlZSAjZ2V0U2luZ2xlUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5Ud2ljZWRRdWV1ZWRVbml0IDxlbT5Ud2ljZWQgUXVldWVkIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHdpY2VkIFF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5Ud2ljZWRRdWV1ZWRVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRUd2ljZWRRdWV1ZWRVbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCA8ZW0+Q2FydGVzaWFuIFF1ZXVlZCBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhcnRlc2lhbiBRdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0I2dldEhlbHBlclVuaXRzIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhlbHBlciBVbml0czwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRIZWxwZXJVbml0cygpDQorCSAqIEBzZWUgI2dldENhcnRlc2lhblF1ZXVlZFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0IDxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRSZWZhY3RvcmluZ1VuaXQoKQ0KKwkgKiBAc2VlICNnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0I2dldFNpbmdsZUlucHV0UG9ydHMgPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0I2dldFNpbmdsZUlucHV0UG9ydHMoKQ0KKwkgKiBAc2VlICNnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRNdWx0aUlucHV0UG9ydHMgPGVtPk11bHRpIElucHV0IFBvcnRzPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NdWx0aSBJbnB1dCBQb3J0czwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRNdWx0aUlucHV0UG9ydHMoKQ0KKwkgKiBAc2VlICNnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdCNnZXRUeXBlKCkNCisJICogQHNlZSAjZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9UeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0I2dldExibFN0cmljdCA8ZW0+TGJsIFN0cmljdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxibCBTdHJpY3Q8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0KCkNCisJICogQHNlZSAjZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9MYmxTdHJpY3QoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQgPGVtPlBhcmFsbGVsIFF1ZXVlZCBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcmFsbGVsIFF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFBhcmFsbGVsUXVldWVkVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0SGVscGVyVW5pdHMgPGVtPkhlbHBlciBVbml0czwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGVscGVyIFVuaXRzPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0SGVscGVyVW5pdHMoKQ0KKwkgKiBAc2VlICNnZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFBhcmFsbGVsUXVldWVkVW5pdF9IZWxwZXJVbml0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0I2dldFJlZmFjdG9yaW5nVW5pdHMgPGVtPlJlZmFjdG9yaW5nIFVuaXRzPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVmYWN0b3JpbmcgVW5pdHM8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdCNnZXRSZWZhY3RvcmluZ1VuaXRzKCkNCisJICogQHNlZSAjZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0U2luZ2xlSW5wdXRQb3J0cyA8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TaW5nbGUgSW5wdXQgUG9ydHM8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdCNnZXRTaW5nbGVJbnB1dFBvcnRzKCkNCisJICogQHNlZSAjZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0TXVsdGlJbnB1dFBvcnRzIDxlbT5NdWx0aSBJbnB1dCBQb3J0czwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TXVsdGkgSW5wdXQgUG9ydHM8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdCNnZXRNdWx0aUlucHV0UG9ydHMoKQ0KKwkgKiBAc2VlICNnZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFBhcmFsbGVsUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0I2dldFR5cGUoKQ0KKwkgKiBAc2VlICNnZXRQYXJhbGxlbFF1ZXVlZFVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldFBhcmFsbGVsUXVldWVkVW5pdF9UeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGJsIFN0cmljdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0I2dldExibFN0cmljdCgpDQorCSAqIEBzZWUgI2dldFBhcmFsbGVsUXVldWVkVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0xibFN0cmljdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLkhlbHBlclVuaXQgPGVtPkhlbHBlciBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkhlbHBlciBVbml0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5IZWxwZXJVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRIZWxwZXJVbml0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5IZWxwZXJVbml0I2dldEhlbHBlclVuaXRJZCA8ZW0+SGVscGVyIFVuaXQgSWQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWxwZXIgVW5pdCBJZDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuSGVscGVyVW5pdCNnZXRIZWxwZXJVbml0SWQoKQ0KKwkgKiBAc2VlICNnZXRIZWxwZXJVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRIZWxwZXJVbml0X0hlbHBlclVuaXRJZCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuSGVscGVyVW5pdCNnZXROYW1lc3BhY2VVcmkgPGVtPk5hbWVzcGFjZSBVcmk8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVXJpPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5IZWxwZXJVbml0I2dldE5hbWVzcGFjZVVyaSgpDQorCSAqIEBzZWUgI2dldEhlbHBlclVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEhlbHBlclVuaXRfTmFtZXNwYWNlVXJpKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuRmVhdHVyZVVuaXQgPGVtPkZlYXR1cmUgVW5pdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GZWF0dXJlIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkZlYXR1cmVVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRGZWF0dXJlVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0IDxlbT5TaW5nbGUgRmVhdHVyZSBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNpbmdsZSBGZWF0dXJlIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRTaW5nbGVGZWF0dXJlVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5wdXQgUG9ydDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0SW5wdXRQb3J0KCkNCisJICogQHNlZSAjZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFNpbmdsZUZlYXR1cmVVbml0X0lucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCNnZXRTZWNvbmRhcnlJbnB1dFBvcnRzIDxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpDQorCSAqIEBzZWUgI2dldFNpbmdsZUZlYXR1cmVVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTaW5nbGVGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCNnZXRPdXRwdXRQb3J0KCkNCisJICogQHNlZSAjZ2V0U2luZ2xlRmVhdHVyZVVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFNpbmdsZUZlYXR1cmVVbml0X091dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0I2dldFNpbmdsZUZlYXR1cmVIZWxwZXIgPGVtPlNpbmdsZSBGZWF0dXJlIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNpbmdsZSBGZWF0dXJlIEhlbHBlcjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcigpDQorCSAqIEBzZWUgI2dldFNpbmdsZUZlYXR1cmVVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTaW5nbGVGZWF0dXJlVW5pdF9TaW5nbGVGZWF0dXJlSGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0VHlwZSgpDQorCSAqIEBzZWUgI2dldFNpbmdsZUZlYXR1cmVVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTaW5nbGVGZWF0dXJlVW5pdF9UeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCA8ZW0+TXVsdGkgRmVhdHVyZSBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk11bHRpIEZlYXR1cmUgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0TXVsdGlGZWF0dXJlVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCNnZXRJbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0I2dldElucHV0UG9ydCgpDQorCSAqIEBzZWUgI2dldE11bHRpRmVhdHVyZVVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpRmVhdHVyZVVuaXRfSW5wdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cyA8ZW0+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpDQorCSAqIEBzZWUgI2dldE11bHRpRmVhdHVyZVVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpRmVhdHVyZVVuaXRfU2Vjb25kYXJ5SW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0I2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAc2VlICNnZXRNdWx0aUZlYXR1cmVVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRNdWx0aUZlYXR1cmVVbml0X091dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQjZ2V0TXVsdGlGZWF0dXJlSGVscGVyIDxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk11bHRpIEZlYXR1cmUgSGVscGVyPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0I2dldE11bHRpRmVhdHVyZUhlbHBlcigpDQorCSAqIEBzZWUgI2dldE11bHRpRmVhdHVyZVVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpRmVhdHVyZVVuaXRfTXVsdGlGZWF0dXJlSGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0I2dldFR5cGUoKQ0KKwkgKiBAc2VlICNnZXRNdWx0aUZlYXR1cmVVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRNdWx0aUZlYXR1cmVVbml0X1R5cGUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5GaWx0ZXJVbml0IDxlbT5GaWx0ZXIgVW5pdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GaWx0ZXIgVW5pdDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuRmlsdGVyVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0RmlsdGVyVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQgPGVtPlNpbmdsZSBGaWx0ZXIgVW5pdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TaW5nbGUgRmlsdGVyIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFNpbmdsZUZpbHRlclVuaXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5wdXQgUG9ydDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdCNnZXRJbnB1dFBvcnQoKQ0KKwkgKiBAc2VlICNnZXRTaW5nbGVGaWx0ZXJVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTaW5nbGVGaWx0ZXJVbml0X0lucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0I2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAc2VlICNnZXRTaW5nbGVGaWx0ZXJVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTaW5nbGVGaWx0ZXJVbml0X091dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQjZ2V0U2luZ2xlRmlsdGVySGVscGVyIDxlbT5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0I2dldFNpbmdsZUZpbHRlckhlbHBlcigpDQorCSAqIEBzZWUgI2dldFNpbmdsZUZpbHRlclVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFNpbmdsZUZpbHRlclVuaXRfU2luZ2xlRmlsdGVySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0I2dldFR5cGUoKQ0KKwkgKiBAc2VlICNnZXRTaW5nbGVGaWx0ZXJVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTaW5nbGVGaWx0ZXJVbml0X1R5cGUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlclVuaXQgPGVtPk11bHRpIEZpbHRlciBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk11bHRpIEZpbHRlciBVbml0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZpbHRlclVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldE11bHRpRmlsdGVyVW5pdCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJVbml0I2dldElucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPklucHV0IFBvcnQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpRmlsdGVyVW5pdCNnZXRJbnB1dFBvcnQoKQ0KKwkgKiBAc2VlICNnZXRNdWx0aUZpbHRlclVuaXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpRmlsdGVyVW5pdF9JbnB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLk11bHRpRmlsdGVyVW5pdCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZpbHRlclVuaXQjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBzZWUgI2dldE11bHRpRmlsdGVyVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0TXVsdGlGaWx0ZXJVbml0X091dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLk11bHRpRmlsdGVyVW5pdCNnZXRNdWx0aUZpbHRlckhlbHBlciA8ZW0+TXVsdGkgRmlsdGVyIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpRmlsdGVyVW5pdCNnZXRNdWx0aUZpbHRlckhlbHBlcigpDQorCSAqIEBzZWUgI2dldE11bHRpRmlsdGVyVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0TXVsdGlGaWx0ZXJVbml0X011bHRpRmlsdGVySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlclVuaXQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpRmlsdGVyVW5pdCNnZXRUeXBlKCkNCisJICogQHNlZSAjZ2V0TXVsdGlGaWx0ZXJVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRNdWx0aUZpbHRlclVuaXRfVHlwZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLkhlbHBlciA8ZW0+SGVscGVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkhlbHBlcjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuSGVscGVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLkhlbHBlciNnZXRIZWxwZXJJZCA8ZW0+SGVscGVyIElkPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGVscGVyIElkPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5IZWxwZXIjZ2V0SGVscGVySWQoKQ0KKwkgKiBAc2VlICNnZXRIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEhlbHBlcl9IZWxwZXJJZCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuSGVscGVyI2dldE5hbWVzcGFjZVVyaSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkhlbHBlciNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAc2VlICNnZXRIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldEhlbHBlcl9OYW1lc3BhY2VVcmkoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5GZWF0dXJlSGVscGVyIDxlbT5GZWF0dXJlIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GZWF0dXJlIEhlbHBlcjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuRmVhdHVyZUhlbHBlcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0RmVhdHVyZUhlbHBlcigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuRmVhdHVyZUhlbHBlciNnZXRJbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5GZWF0dXJlSGVscGVyI2dldElucHV0UG9ydCgpDQorCSAqIEBzZWUgI2dldEZlYXR1cmVIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldEZlYXR1cmVIZWxwZXJfSW5wdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgY29tcmVsLkZlYXR1cmVIZWxwZXIjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cyA8ZW0+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLkZlYXR1cmVIZWxwZXIjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpDQorCSAqIEBzZWUgI2dldEZlYXR1cmVIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldEZlYXR1cmVIZWxwZXJfU2Vjb25kYXJ5SW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXIgPGVtPlNpbmdsZSBGZWF0dXJlIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFNpbmdsZUZlYXR1cmVIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXIjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PdXRwdXQgUG9ydDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlRmVhdHVyZUhlbHBlciNnZXRPdXRwdXRQb3J0KCkNCisJICogQHNlZSAjZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcl9PdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyIDxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRNdWx0aUZlYXR1cmVIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLk11bHRpRmVhdHVyZUhlbHBlciNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXIjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBzZWUgI2dldE11bHRpRmVhdHVyZUhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0TXVsdGlGZWF0dXJlSGVscGVyX091dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5GaWx0ZXJIZWxwZXIgPGVtPkZpbHRlciBIZWxwZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmlsdGVyIEhlbHBlcjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuRmlsdGVySGVscGVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRGaWx0ZXJIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLkZpbHRlckhlbHBlciNnZXRJbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5GaWx0ZXJIZWxwZXIjZ2V0SW5wdXRQb3J0KCkNCisJICogQHNlZSAjZ2V0RmlsdGVySGVscGVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRGaWx0ZXJIZWxwZXJfSW5wdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyIDxlbT5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLlNpbmdsZUZpbHRlckhlbHBlciNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXIjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBzZWUgI2dldFNpbmdsZUZpbHRlckhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0U2luZ2xlRmlsdGVySGVscGVyX091dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlciA8ZW0+TXVsdGkgRmlsdGVyIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aSBGaWx0ZXIgSGVscGVyPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgY29tcmVsLk11bHRpRmlsdGVySGVscGVyI2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3V0cHV0IFBvcnQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpRmlsdGVySGVscGVyI2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAc2VlICNnZXRNdWx0aUZpbHRlckhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVSZWZlcmVuY2UgZ2V0TXVsdGlGaWx0ZXJIZWxwZXJfT3V0cHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLlBvcnQgPGVtPlBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuUG9ydA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBjb21yZWwuUG9ydCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuUG9ydCNnZXRUeXBlKCkNCisJICogQHNlZSAjZ2V0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVBdHRyaWJ1dGUgZ2V0UG9ydF9UeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlUG9ydCA8ZW0+U2luZ2xlIFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2luZ2xlIFBvcnQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZVBvcnQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFNpbmdsZVBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgY29tcmVsLlNpbmdsZVBvcnQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZVBvcnQjZ2V0VmFsdWUoKQ0KKwkgKiBAc2VlICNnZXRTaW5nbGVQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUF0dHJpYnV0ZSBnZXRTaW5nbGVQb3J0X1ZhbHVlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuTXVsdGlQb3J0IDxlbT5NdWx0aSBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk11bHRpIFBvcnQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpUG9ydA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0TXVsdGlQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgY29tcmVsLk11bHRpUG9ydCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlZhbHVlPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVBvcnQjZ2V0VmFsdWUoKQ0KKwkgKiBAc2VlICNnZXRNdWx0aVBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQXR0cmlidXRlIGdldE11bHRpUG9ydF9WYWx1ZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLklucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5JbnB1dFBvcnQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldElucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgY29tcmVsLk91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5PdXRwdXRQb3J0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRPdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlSW5wdXRQb3J0IDxlbT5TaW5nbGUgSW5wdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TaW5nbGUgSW5wdXQgUG9ydDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlSW5wdXRQb3J0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRTaW5nbGVJbnB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5NdWx0aUlucHV0UG9ydCA8ZW0+TXVsdGkgSW5wdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUlucHV0UG9ydA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFQ2xhc3MgZ2V0TXVsdGlJbnB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5TaW5nbGVPdXRwdXRQb3J0IDxlbT5TaW5nbGUgT3V0cHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2luZ2xlIE91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVPdXRwdXRQb3J0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRTaW5nbGVPdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuTXVsdGlPdXRwdXRQb3J0IDxlbT5NdWx0aSBPdXRwdXQgUG9ydDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aSBPdXRwdXQgUG9ydDwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuTXVsdGlPdXRwdXRQb3J0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRNdWx0aU91dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5Qb3J0TWFwcGluZyA8ZW0+UG9ydCBNYXBwaW5nPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQgTWFwcGluZzwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuUG9ydE1hcHBpbmcNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFBvcnRNYXBwaW5nKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcgPGVtPlNpbmdsZSBQb3J0IE1hcHBpbmc8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2luZ2xlIFBvcnQgTWFwcGluZzwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUNsYXNzIGdldFNpbmdsZVBvcnRNYXBwaW5nKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVQb3J0TWFwcGluZyNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNvdXJjZTwvZW0+Jy4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcjZ2V0U291cmNlKCkNCisJICogQHNlZSAjZ2V0U2luZ2xlUG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldFNpbmdsZVBvcnRNYXBwaW5nX1NvdXJjZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UYXJnZXQ8L2VtPicuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZVBvcnRNYXBwaW5nI2dldFRhcmdldCgpDQorCSAqIEBzZWUgI2dldFNpbmdsZVBvcnRNYXBwaW5nKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRVJlZmVyZW5jZSBnZXRTaW5nbGVQb3J0TWFwcGluZ19UYXJnZXQoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nIDxlbT5NdWx0aSBQb3J0IE1hcHBpbmc8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TXVsdGkgUG9ydCBNYXBwaW5nPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRNdWx0aVBvcnRNYXBwaW5nKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U291cmNlPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nI2dldFNvdXJjZSgpDQorCSAqIEBzZWUgI2dldE11bHRpUG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpUG9ydE1hcHBpbmdfU291cmNlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGFyZ2V0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nI2dldFRhcmdldCgpDQorCSAqIEBzZWUgI2dldE11bHRpUG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpUG9ydE1hcHBpbmdfVGFyZ2V0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBjb21yZWwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZyA8ZW0+TXVsdGkgU2luZ2xlIFBvcnQgTWFwcGluZzwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NdWx0aSBTaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVDbGFzcyBnZXRNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+U291cmNlPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nI2dldFNvdXJjZSgpDQorCSAqIEBzZWUgI2dldE11bHRpU2luZ2xlUG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfU291cmNlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGFyZ2V0PC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nI2dldFRhcmdldCgpDQorCSAqIEBzZWUgI2dldE11bHRpU2luZ2xlUG9ydE1hcHBpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFUmVmZXJlbmNlIGdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfVGFyZ2V0KCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIGNvbXJlbC5NYXBwaW5nVmlzdWFsaXphdGlvbiA8ZW0+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9lbT4nLg0KKwkgKiBAc2VlIGNvbXJlbC5NYXBwaW5nVmlzdWFsaXphdGlvbg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFRW51bSBnZXRNYXBwaW5nVmlzdWFsaXphdGlvbigpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQ29tcmVsRmFjdG9yeSBnZXRDb21yZWxGYWN0b3J5KCk7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50DQorCSAqIDx1bD4NCisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPg0KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCisJICogPC91bD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCWludGVyZmFjZSBMaXRlcmFscyB7DQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5Db21wb3NpdGVSZWZhY3RvcmluZ0ltcGwgPGVtPkNvbXBvc2l0ZSBSZWZhY3RvcmluZzwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nSW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSZWZhY3RvcmluZygpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBDT01QT1NJVEVfUkVGQUNUT1JJTkcgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gUmVmYWN0b3JpbmcgVW5pdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfTWFpblJlZmFjdG9yaW5nVW5pdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUkVGQUNUT1JJTkdfX1BPUlRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfUG9ydE1hcHBpbmdzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb2RlbCBSZWZhY3RvcmluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NT0RFTF9SRUZBQ1RPUklOR1MgPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfTW9kZWxSZWZhY3RvcmluZ3MoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlbHBlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUkVGQUNUT1JJTkdfX0hFTFBFUiA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVSZWZhY3RvcmluZ19IZWxwZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBpbmcgVmlzdWFsaXphdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQVBQSU5HX1ZJU1VBTElaQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfTWFwcGluZ1Zpc3VhbGl6YXRpb24oKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbSBJbml0aWFsIENvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fSU5JVElBTF9DT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfQ3VzdG9tSW5pdGlhbENvbmRpdGlvbigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9tIEZpbmFsIENvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fRklOQUxfQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX0N1c3RvbUZpbmFsQ29uZGl0aW9uKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLk5hbWVkRWxlbWVudA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgTkFNRURfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIE5BTUVEX0VMRU1FTlRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5EZXNjcmliZWRFbGVtZW50IDxlbT5EZXNjcmliZWQgRWxlbWVudDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5EZXNjcmliZWRFbGVtZW50DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldERlc2NyaWJlZEVsZW1lbnQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgREVTQ1JJQkVEX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmVkRWxlbWVudCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIERFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmliZWRFbGVtZW50X0Rlc2NyaXB0aW9uKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5SZWZhY3RvcmluZ1VuaXRJbXBsIDxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuUmVmYWN0b3JpbmdVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRSZWZhY3RvcmluZ1VuaXQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgUkVGQUNUT1JJTkdfVU5JVCA9IGVJTlNUQU5DRS5nZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcSBFeGVjdXRpb24gT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFJFRkFDVE9SSU5HX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVIgPSBlSU5TVEFOQ0UuZ2V0UmVmYWN0b3JpbmdVbml0X1NlcUV4ZWN1dGlvbk9yZGVyKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5Nb2RlbFJlZmFjdG9yaW5nSW1wbCA8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Nb2RlbFJlZmFjdG9yaW5nSW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRNb2RlbFJlZmFjdG9yaW5nKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIE1PREVMX1JFRkFDVE9SSU5HID0gZUlOU1RBTkNFLmdldE1vZGVsUmVmYWN0b3JpbmcoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZiBJZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgTU9ERUxfUkVGQUNUT1JJTkdfX1JFRl9JRCA9IGVJTlNUQU5DRS5nZXRNb2RlbFJlZmFjdG9yaW5nX1JlZklkKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgTU9ERUxfUkVGQUNUT1JJTkdfX0xBQkVMID0gZUlOU1RBTkNFLmdldE1vZGVsUmVmYWN0b3JpbmdfTGFiZWwoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIE1PREVMX1JFRkFDVE9SSU5HX19OQU1FU1BBQ0VfVVJJID0gZUlOU1RBTkNFLmdldE1vZGVsUmVmYWN0b3JpbmdfTmFtZXNwYWNlVXJpKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNT0RFTF9SRUZBQ1RPUklOR19fSU5QVVRfUE9SVFMgPSBlSU5TVEFOQ0UuZ2V0TW9kZWxSZWZhY3RvcmluZ19JbnB1dFBvcnRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbCA8ZW0+QXRvbWljIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRBdG9taWNVbml0KCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIEFUT01JQ19VTklUID0gZUlOU1RBTkNFLmdldEF0b21pY1VuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIEFUT01JQ19VTklUX19JTlBVVF9QT1JUUyA9IGVJTlNUQU5DRS5nZXRBdG9taWNVbml0X0lucHV0UG9ydHMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuaXQgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEFUT01JQ19VTklUX19VTklUX0lEID0gZUlOU1RBTkNFLmdldEF0b21pY1VuaXRfVW5pdElkKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQVRPTUlDX1VOSVRfX0xBQkVMID0gZUlOU1RBTkNFLmdldEF0b21pY1VuaXRfTGFiZWwoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEFUT01JQ19VTklUX19OQU1FU1BBQ0VfVVJJID0gZUlOU1RBTkNFLmdldEF0b21pY1VuaXRfTmFtZXNwYWNlVXJpKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBBVE9NSUNfVU5JVF9fVFlQRSA9IGVJTlNUQU5DRS5nZXRBdG9taWNVbml0X1R5cGUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGVsIFJlZmFjdG9yaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBBVE9NSUNfVU5JVF9fTU9ERUxfUkVGQUNUT1JJTkcgPSBlSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9Nb2RlbFJlZmFjdG9yaW5nKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVjayBJbml0aWFsIENvbmRpdGlvbiBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBBVE9NSUNfVU5JVF9fQ0hFQ0tfSU5JVElBTF9DT05ESVRJT05fRkxBRyA9IGVJTlNUQU5DRS5nZXRBdG9taWNVbml0X0NoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoZWNrIEZpbmFsIENvbmRpdGlvbiBGbGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBBVE9NSUNfVU5JVF9fQ0hFQ0tfRklOQUxfQ09ORElUSU9OX0ZMQUcgPSBlSU5TVEFOQ0UuZ2V0QXRvbWljVW5pdF9DaGVja0ZpbmFsQ29uZGl0aW9uRmxhZygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuQ29tcG9zaXRlVW5pdEltcGwgPGVtPkNvbXBvc2l0ZSBVbml0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcG9zaXRlVW5pdEltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0Q29tcG9zaXRlVW5pdCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBDT01QT1NJVEVfVU5JVCA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVVbml0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5TZXF1ZW50aWFsVW5pdEltcGwgPGVtPlNlcXVlbnRpYWwgVW5pdDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLlNlcXVlbnRpYWxVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRTZXF1ZW50aWFsVW5pdCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTRVFVRU5USUFMX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTRVFVRU5USUFMX1VOSVRfX0hFTFBFUl9VTklUUyA9IGVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9IZWxwZXJVbml0cygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmYWN0b3JpbmcgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgU0VRVUVOVElBTF9VTklUX19SRUZBQ1RPUklOR19VTklUUyA9IGVJTlNUQU5DRS5nZXRTZXF1ZW50aWFsVW5pdF9SZWZhY3RvcmluZ1VuaXRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTRVFVRU5USUFMX1VOSVRfX0lOUFVUX1BPUlRTID0gZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0lucHV0UG9ydHMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU0VRVUVOVElBTF9VTklUX19TVFJJQ1QgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfU3RyaWN0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTRVFVRU5USUFMX1VOSVRfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VxdWVudGlhbFVuaXRfVHlwZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGJsIFN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU0VRVUVOVElBTF9VTklUX19MQkxfU1RSSUNUID0gZUlOU1RBTkNFLmdldFNlcXVlbnRpYWxVbml0X0xibFN0cmljdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuQ29uZGl0aW9uQ2hlY2tJbXBsIDxlbT5Db25kaXRpb24gQ2hlY2s8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db25kaXRpb25DaGVja0ltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0Q29uZGl0aW9uQ2hlY2soKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgQ09ORElUSU9OX0NIRUNLID0gZUlOU1RBTkNFLmdldENvbmRpdGlvbkNoZWNrKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBDT05ESVRJT05fQ0hFQ0tfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uQ2hlY2tfVHlwZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3BlYzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQ09ORElUSU9OX0NIRUNLX19TUEVDID0gZUlOU1RBTkNFLmdldENvbmRpdGlvbkNoZWNrX1NwZWMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLkNvbmRpdGlvbmFsVW5pdEltcGwgPGVtPkNvbmRpdGlvbmFsIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db25kaXRpb25hbFVuaXRJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldENvbmRpdGlvbmFsVW5pdCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBDT05ESVRJT05BTF9VTklUID0gZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENPTkRJVElPTkFMX1VOSVRfX0lGID0gZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9JZigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIFVuaXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENPTkRJVElPTkFMX1VOSVRfX0hFTFBFUl9VTklUUyA9IGVJTlNUQU5DRS5nZXRDb25kaXRpb25hbFVuaXRfSGVscGVyVW5pdHMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRoZW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENPTkRJVElPTkFMX1VOSVRfX1RIRU4gPSBlSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X1RoZW4oKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENPTkRJVElPTkFMX1VOSVRfX0VMU0UgPSBlSU5TVEFOQ0UuZ2V0Q29uZGl0aW9uYWxVbml0X0Vsc2UoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENPTkRJVElPTkFMX1VOSVRfX0lOUFVUX1BPUlRTID0gZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9JbnB1dFBvcnRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBDT05ESVRJT05BTF9VTklUX19UWVBFID0gZUlOU1RBTkNFLmdldENvbmRpdGlvbmFsVW5pdF9UeXBlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5RdWV1ZWRVbml0SW1wbCA8ZW0+UXVldWVkIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5RdWV1ZWRVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRRdWV1ZWRVbml0KCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFFVRVVFRF9VTklUID0gZUlOU1RBTkNFLmdldFF1ZXVlZFVuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgUVVFVUVEX1VOSVRfX1NUUklDVCA9IGVJTlNUQU5DRS5nZXRRdWV1ZWRVbml0X1N0cmljdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlUXVldWVkVW5pdEltcGwgPGVtPlNpbmdsZSBRdWV1ZWQgVW5pdDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZVF1ZXVlZFVuaXRJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZVF1ZXVlZFVuaXQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgU0lOR0xFX1FVRVVFRF9VTklUID0gZUlOU1RBTkNFLmdldFNpbmdsZVF1ZXVlZFVuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUyA9IGVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZhY3RvcmluZyBVbml0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpbmdsZSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUyA9IGVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk11bHRpIElucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIFNJTkdMRV9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTSU5HTEVfUVVFVUVEX1VOSVRfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9UeXBlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYmwgU3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBTSU5HTEVfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlR3aWNlZFF1ZXVlZFVuaXRJbXBsIDxlbT5Ud2ljZWQgUXVldWVkIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Ud2ljZWRRdWV1ZWRVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRUd2ljZWRRdWV1ZWRVbml0KCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFRXSUNFRF9RVUVVRURfVU5JVCA9IGVJTlNUQU5DRS5nZXRUd2ljZWRRdWV1ZWRVbml0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0SW1wbCA8ZW0+Q2FydGVzaWFuIFF1ZXVlZCBVbml0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ2FydGVzaWFuUXVldWVkVW5pdEltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBDQVJURVNJQU5fUVVFVUVEX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIFVuaXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENBUlRFU0lBTl9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTID0gZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmFjdG9yaW5nIFVuaXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCA9IGVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2luZ2xlIElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIENBUlRFU0lBTl9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTID0gZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TXVsdGkgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUyA9IGVJTlNUQU5DRS5nZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0cygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19UWVBFID0gZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfVHlwZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGJsIFN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19MQkxfU1RSSUNUID0gZUlOU1RBTkNFLmdldENhcnRlc2lhblF1ZXVlZFVuaXRfTGJsU3RyaWN0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5QYXJhbGxlbFF1ZXVlZFVuaXRJbXBsIDxlbT5QYXJhbGxlbCBRdWV1ZWQgVW5pdDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLlBhcmFsbGVsUXVldWVkVW5pdEltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFBBUkFMTEVMX1FVRVVFRF9VTklUID0gZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVscGVyIFVuaXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIFBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMgPSBlSU5TVEFOQ0UuZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZhY3RvcmluZyBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgUEFSQUxMRUxfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVRTID0gZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaW5nbGUgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgUEFSQUxMRUxfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUyA9IGVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TXVsdGkgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgUEFSQUxMRUxfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlRTID0gZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydHMoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFBBUkFMTEVMX1FVRVVFRF9VTklUX19UWVBFID0gZUlOU1RBTkNFLmdldFBhcmFsbGVsUXVldWVkVW5pdF9UeXBlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYmwgU3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBQQVJBTExFTF9RVUVVRURfVU5JVF9fTEJMX1NUUklDVCA9IGVJTlNUQU5DRS5nZXRQYXJhbGxlbFF1ZXVlZFVuaXRfTGJsU3RyaWN0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5IZWxwZXJVbml0SW1wbCA8ZW0+SGVscGVyIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5IZWxwZXJVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRIZWxwZXJVbml0KCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIEhFTFBFUl9VTklUID0gZUlOU1RBTkNFLmdldEhlbHBlclVuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0IElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBIRUxQRVJfVU5JVF9fSEVMUEVSX1VOSVRfSUQgPSBlSU5TVEFOQ0UuZ2V0SGVscGVyVW5pdF9IZWxwZXJVbml0SWQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEhFTFBFUl9VTklUX19OQU1FU1BBQ0VfVVJJID0gZUlOU1RBTkNFLmdldEhlbHBlclVuaXRfTmFtZXNwYWNlVXJpKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5GZWF0dXJlVW5pdEltcGwgPGVtPkZlYXR1cmUgVW5pdDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkZlYXR1cmVVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRGZWF0dXJlVW5pdCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBGRUFUVVJFX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZVVuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVVbml0SW1wbCA8ZW0+U2luZ2xlIEZlYXR1cmUgVW5pdDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRTaW5nbGVGZWF0dXJlVW5pdCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTSU5HTEVfRkVBVFVSRV9VTklUID0gZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUID0gZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVVbml0X0lucHV0UG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIFNJTkdMRV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUyA9IGVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgU0lOR0xFX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfT3V0cHV0UG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfRkVBVFVSRV9VTklUX19TSU5HTEVfRkVBVFVSRV9IRUxQRVIgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlRmVhdHVyZVVuaXRfU2luZ2xlRmVhdHVyZUhlbHBlcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU0lOR0xFX0ZFQVRVUkVfVU5JVF9fVFlQRSA9IGVJTlNUQU5DRS5nZXRTaW5nbGVGZWF0dXJlVW5pdF9UeXBlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5NdWx0aUZlYXR1cmVVbml0SW1wbCA8ZW0+TXVsdGkgRmVhdHVyZSBVbml0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuTXVsdGlGZWF0dXJlVW5pdEltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0TXVsdGlGZWF0dXJlVW5pdCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBNVUxUSV9GRUFUVVJFX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgTVVMVElfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUID0gZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXRfSW5wdXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgTVVMVElfRkVBVFVSRV9VTklUX19TRUNPTkRBUllfSU5QVVRfUE9SVFMgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgTVVMVElfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVVbml0X091dHB1dFBvcnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk11bHRpIEZlYXR1cmUgSGVscGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9GRUFUVVJFX1VOSVRfX01VTFRJX0ZFQVRVUkVfSEVMUEVSID0gZUlOU1RBTkNFLmdldE11bHRpRmVhdHVyZVVuaXRfTXVsdGlGZWF0dXJlSGVscGVyKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBNVUxUSV9GRUFUVVJFX1VOSVRfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlVW5pdF9UeXBlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5GaWx0ZXJVbml0SW1wbCA8ZW0+RmlsdGVyIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5GaWx0ZXJVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRGaWx0ZXJVbml0KCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIEZJTFRFUl9VTklUID0gZUlOU1RBTkNFLmdldEZpbHRlclVuaXQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZpbHRlclVuaXRJbXBsIDxlbT5TaW5nbGUgRmlsdGVyIFVuaXQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5TaW5nbGVGaWx0ZXJVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRTaW5nbGVGaWx0ZXJVbml0KCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFNJTkdMRV9GSUxURVJfVU5JVCA9IGVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdF9JbnB1dFBvcnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUID0gZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlclVuaXRfT3V0cHV0UG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2luZ2xlIEZpbHRlciBIZWxwZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIFNJTkdMRV9GSUxURVJfVU5JVF9fU0lOR0xFX0ZJTFRFUl9IRUxQRVIgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlRmlsdGVyVW5pdF9TaW5nbGVGaWx0ZXJIZWxwZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIFNJTkdMRV9GSUxURVJfVU5JVF9fVFlQRSA9IGVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJVbml0X1R5cGUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpRmlsdGVyVW5pdEltcGwgPGVtPk11bHRpIEZpbHRlciBVbml0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuTXVsdGlGaWx0ZXJVbml0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRNdWx0aUZpbHRlclVuaXQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgTVVMVElfRklMVEVSX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJVbml0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXRfSW5wdXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUID0gZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdF9PdXRwdXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NdWx0aSBGaWx0ZXIgSGVscGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9GSUxURVJfVU5JVF9fTVVMVElfRklMVEVSX0hFTFBFUiA9IGVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlclVuaXRfTXVsdGlGaWx0ZXJIZWxwZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIE1VTFRJX0ZJTFRFUl9VTklUX19UWVBFID0gZUlOU1RBTkNFLmdldE11bHRpRmlsdGVyVW5pdF9UeXBlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5IZWxwZXJJbXBsIDxlbT5IZWxwZXI8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5IZWxwZXJJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldEhlbHBlcigpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBIRUxQRVIgPSBlSU5TVEFOQ0UuZ2V0SGVscGVyKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWxwZXIgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQXR0cmlidXRlIEhFTFBFUl9fSEVMUEVSX0lEID0gZUlOU1RBTkNFLmdldEhlbHBlcl9IZWxwZXJJZCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgSEVMUEVSX19OQU1FU1BBQ0VfVVJJID0gZUlOU1RBTkNFLmdldEhlbHBlcl9OYW1lc3BhY2VVcmkoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLkZlYXR1cmVIZWxwZXJJbXBsIDxlbT5GZWF0dXJlIEhlbHBlcjwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkZlYXR1cmVIZWxwZXJJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldEZlYXR1cmVIZWxwZXIoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgRkVBVFVSRV9IRUxQRVIgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZUhlbHBlcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgRkVBVFVSRV9IRUxQRVJfX0lOUFVUX1BPUlQgPSBlSU5TVEFOQ0UuZ2V0RmVhdHVyZUhlbHBlcl9JbnB1dFBvcnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBGRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTID0gZUlOU1RBTkNFLmdldEZlYXR1cmVIZWxwZXJfU2Vjb25kYXJ5SW5wdXRQb3J0cygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlRmVhdHVyZUhlbHBlckltcGwgPGVtPlNpbmdsZSBGZWF0dXJlIEhlbHBlcjwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVIZWxwZXJJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZUZlYXR1cmVIZWxwZXIoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgU0lOR0xFX0ZFQVRVUkVfSEVMUEVSID0gZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVIZWxwZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JUID0gZUlOU1RBTkNFLmdldFNpbmdsZUZlYXR1cmVIZWxwZXJfT3V0cHV0UG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuTXVsdGlGZWF0dXJlSGVscGVySW1wbCA8ZW0+TXVsdGkgRmVhdHVyZSBIZWxwZXI8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5NdWx0aUZlYXR1cmVIZWxwZXJJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpRmVhdHVyZUhlbHBlcigpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBNVUxUSV9GRUFUVVJFX0hFTFBFUiA9IGVJTlNUQU5DRS5nZXRNdWx0aUZlYXR1cmVIZWxwZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlGZWF0dXJlSGVscGVyX091dHB1dFBvcnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLkZpbHRlckhlbHBlckltcGwgPGVtPkZpbHRlciBIZWxwZXI8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5GaWx0ZXJIZWxwZXJJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldEZpbHRlckhlbHBlcigpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBGSUxURVJfSEVMUEVSID0gZUlOU1RBTkNFLmdldEZpbHRlckhlbHBlcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJIZWxwZXJfSW5wdXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5TaW5nbGVGaWx0ZXJIZWxwZXJJbXBsIDxlbT5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLlNpbmdsZUZpbHRlckhlbHBlckltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0U2luZ2xlRmlsdGVySGVscGVyKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFNJTkdMRV9GSUxURVJfSEVMUEVSID0gZUlOU1RBTkNFLmdldFNpbmdsZUZpbHRlckhlbHBlcigpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFUmVmZXJlbmNlIFNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRTaW5nbGVGaWx0ZXJIZWxwZXJfT3V0cHV0UG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuTXVsdGlGaWx0ZXJIZWxwZXJJbXBsIDxlbT5NdWx0aSBGaWx0ZXIgSGVscGVyPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuTXVsdGlGaWx0ZXJIZWxwZXJJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpRmlsdGVySGVscGVyKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIE1VTFRJX0ZJTFRFUl9IRUxQRVIgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRNdWx0aUZpbHRlckhlbHBlcl9PdXRwdXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5Qb3J0SW1wbCA8ZW0+UG9ydDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLlBvcnRJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFBvcnQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgUE9SVCA9IGVJTlNUQU5DRS5nZXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUF0dHJpYnV0ZSBQT1JUX19UWVBFID0gZUlOU1RBTkNFLmdldFBvcnRfVHlwZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlUG9ydEltcGwgPGVtPlNpbmdsZSBQb3J0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuU2luZ2xlUG9ydEltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0U2luZ2xlUG9ydCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTSU5HTEVfUE9SVCA9IGVJTlNUQU5DRS5nZXRTaW5nbGVQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgU0lOR0xFX1BPUlRfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFNpbmdsZVBvcnRfVmFsdWUoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpUG9ydEltcGwgPGVtPk11bHRpIFBvcnQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5NdWx0aVBvcnRJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpUG9ydCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBNVUxUSV9QT1JUID0gZUlOU1RBTkNFLmdldE11bHRpUG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVBdHRyaWJ1dGUgTVVMVElfUE9SVF9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlQb3J0X1ZhbHVlKCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5JbnB1dFBvcnRJbXBsIDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuSW5wdXRQb3J0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRJbnB1dFBvcnQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgSU5QVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRJbnB1dFBvcnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk91dHB1dFBvcnRJbXBsIDxlbT5PdXRwdXQgUG9ydDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLk91dHB1dFBvcnRJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE91dHB1dFBvcnQoKQ0KKwkJICogQGdlbmVyYXRlZA0KKwkJICovDQorCQlFQ2xhc3MgT1VUUFVUX1BPUlQgPSBlSU5TVEFOQ0UuZ2V0T3V0cHV0UG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlSW5wdXRQb3J0SW1wbCA8ZW0+U2luZ2xlIElucHV0IFBvcnQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5TaW5nbGVJbnB1dFBvcnRJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZUlucHV0UG9ydCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTSU5HTEVfSU5QVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRTaW5nbGVJbnB1dFBvcnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpSW5wdXRQb3J0SW1wbCA8ZW0+TXVsdGkgSW5wdXQgUG9ydDwvZW0+fScgY2xhc3MuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLk11bHRpSW5wdXRQb3J0SW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRNdWx0aUlucHV0UG9ydCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBNVUxUSV9JTlBVVF9QT1JUID0gZUlOU1RBTkNFLmdldE11bHRpSW5wdXRQb3J0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5TaW5nbGVPdXRwdXRQb3J0SW1wbCA8ZW0+U2luZ2xlIE91dHB1dCBQb3J0PC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuU2luZ2xlT3V0cHV0UG9ydEltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0U2luZ2xlT3V0cHV0UG9ydCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBTSU5HTEVfT1VUUFVUX1BPUlQgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlT3V0cHV0UG9ydCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuTXVsdGlPdXRwdXRQb3J0SW1wbCA8ZW0+TXVsdGkgT3V0cHV0IFBvcnQ8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5NdWx0aU91dHB1dFBvcnRJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE11bHRpT3V0cHV0UG9ydCgpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBNVUxUSV9PVVRQVVRfUE9SVCA9IGVJTlNUQU5DRS5nZXRNdWx0aU91dHB1dFBvcnQoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIGNvbXJlbC5pbXBsLlBvcnRNYXBwaW5nSW1wbCA8ZW0+UG9ydCBNYXBwaW5nPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuUG9ydE1hcHBpbmdJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFBvcnRNYXBwaW5nKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFBPUlRfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRQb3J0TWFwcGluZygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlUG9ydE1hcHBpbmdJbXBsIDxlbT5TaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuU2luZ2xlUG9ydE1hcHBpbmdJbXBsDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldFNpbmdsZVBvcnRNYXBwaW5nKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIFNJTkdMRV9QT1JUX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlUG9ydE1hcHBpbmcoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgU0lOR0xFX1BPUlRfTUFQUElOR19fU09VUkNFID0gZUlOU1RBTkNFLmdldFNpbmdsZVBvcnRNYXBwaW5nX1NvdXJjZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBTSU5HTEVfUE9SVF9NQVBQSU5HX19UQVJHRVQgPSBlSU5TVEFOQ0UuZ2V0U2luZ2xlUG9ydE1hcHBpbmdfVGFyZ2V0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuaW1wbC5NdWx0aVBvcnRNYXBwaW5nSW1wbCA8ZW0+TXVsdGkgUG9ydCBNYXBwaW5nPC9lbT59JyBjbGFzcy4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLmltcGwuTXVsdGlQb3J0TWFwcGluZ0ltcGwNCisJCSAqIEBzZWUgY29tcmVsLmltcGwuQ29tcmVsUGFja2FnZUltcGwjZ2V0TXVsdGlQb3J0TWFwcGluZygpDQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVDbGFzcyBNVUxUSV9QT1JUX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlQb3J0TWFwcGluZygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9QT1JUX01BUFBJTkdfX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRNdWx0aVBvcnRNYXBwaW5nX1NvdXJjZSgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9QT1JUX01BUFBJTkdfX1RBUkdFVCA9IGVJTlNUQU5DRS5nZXRNdWx0aVBvcnRNYXBwaW5nX1RhcmdldCgpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgY29tcmVsLmltcGwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0ltcGwgPGVtPk11bHRpIFNpbmdsZSBQb3J0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLg0KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSW1wbA0KKwkJICogQHNlZSBjb21yZWwuaW1wbC5Db21yZWxQYWNrYWdlSW1wbCNnZXRNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUNsYXNzIE1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZygpOw0KKw0KKwkJLyoqDQorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRVJlZmVyZW5jZSBNVUxUSV9TSU5HTEVfUE9SVF9NQVBQSU5HX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZ19Tb3VyY2UoKTsNCisNCisJCS8qKg0KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuDQorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCQkgKiBAZ2VuZXJhdGVkDQorCQkgKi8NCisJCUVSZWZlcmVuY2UgTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VUID0gZUlOU1RBTkNFLmdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfVGFyZ2V0KCk7DQorDQorCQkvKioNCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBjb21yZWwuTWFwcGluZ1Zpc3VhbGl6YXRpb24gPGVtPk1hcHBpbmcgVmlzdWFsaXphdGlvbjwvZW0+fScgZW51bS4NCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJCSAqIEBzZWUgY29tcmVsLk1hcHBpbmdWaXN1YWxpemF0aW9uDQorCQkgKiBAc2VlIGNvbXJlbC5pbXBsLkNvbXJlbFBhY2thZ2VJbXBsI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uKCkNCisJCSAqIEBnZW5lcmF0ZWQNCisJCSAqLw0KKwkJRUVudW0gTUFQUElOR19WSVNVQUxJWkFUSU9OID0gZUlOU1RBTkNFLmdldE1hcHBpbmdWaXN1YWxpemF0aW9uKCk7DQorDQorCX0NCisNCit9IC8vQ29tcmVsUGFja2FnZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Db25kaXRpb25DaGVjay5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0NvbmRpdGlvbkNoZWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0ZDAyZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Db25kaXRpb25DaGVjay5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25kaXRpb24gQ2hlY2s8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkNvbmRpdGlvbkNoZWNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQ29uZGl0aW9uQ2hlY2sjZ2V0U3BlYyA8ZW0+U3BlYzwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENvbmRpdGlvbkNoZWNrKCkNCisgKiBAbW9kZWwgYW5ub3RhdGlvbj0iZ21mLm5vZGUgZm9vPSdiYXInIGxhYmVsLmljb249J2ZhbHNlJyBsYWJlbD0nbmFtZSx0eXBlLHNwZWMnIGxhYmVsLnBhdHRlcm49J3swfTp7MX0gLXsyfS0nIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIENvbmRpdGlvbkNoZWNrIGV4dGVuZHMgTmFtZWRFbGVtZW50LCBEZXNjcmliZWRFbGVtZW50IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkNvbmRpdGlvbiBDaGVjayI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q29uZGl0aW9uQ2hlY2tfVHlwZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJDb25kaXRpb24gQ2hlY2siIGNoYW5nZWFibGU9ImZhbHNlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0VHlwZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3BlYzwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3BlYzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BlYzwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldFNwZWMoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENvbmRpdGlvbkNoZWNrX1NwZWMoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFNwZWMoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5Db25kaXRpb25DaGVjayNnZXRTcGVjIDxlbT5TcGVjPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcGVjPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0U3BlYygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0U3BlYyhTdHJpbmcgdmFsdWUpOw0KKw0KK30gLy8gQ29uZGl0aW9uQ2hlY2sNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29uZGl0aW9uYWxVbml0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvQ29uZGl0aW9uYWxVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzNmExMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Db25kaXRpb25hbFVuaXQuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZGl0aW9uYWwgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldElmIDxlbT5JZjwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0SGVscGVyVW5pdHMgPGVtPkhlbHBlciBVbml0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0VGhlbiA8ZW0+VGhlbjwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0RWxzZSA8ZW0+RWxzZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDb25kaXRpb25hbFVuaXQoKQ0KKyAqIEBtb2RlbCBhbm5vdGF0aW9uPSJnbWYubm9kZSBmb289J2JhcicgbGFiZWwuaWNvbj0nZmFsc2UnIGxhYmVsPSduYW1lLHR5cGUnIGxhYmVsLnBhdHRlcm49J3swfTp7MX0nIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIENvbmRpdGlvbmFsVW5pdCBleHRlbmRzIENvbXBvc2l0ZVVuaXQgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklmPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldElmKENvbmRpdGlvbkNoZWNrKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENvbmRpdGlvbmFsVW5pdF9JZigpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuY29tcGFydG1lbnQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlDb25kaXRpb25DaGVjayBnZXRJZigpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkNvbmRpdGlvbmFsVW5pdCNnZXRJZiA8ZW0+SWY8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklmPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0SWYoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldElmKENvbmRpdGlvbkNoZWNrIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuSGVscGVyVW5pdH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWxwZXIgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVscGVyIFVuaXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENvbmRpdGlvbmFsVW5pdF9IZWxwZXJVbml0cygpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5jb21wYXJ0bWVudCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PEhlbHBlclVuaXQ+IGdldEhlbHBlclVuaXRzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaGVuPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UaGVuPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaGVuPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0VGhlbihSZWZhY3RvcmluZ1VuaXQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0Q29uZGl0aW9uYWxVbml0X1RoZW4oKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmNvbXBhcnRtZW50IGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJUmVmYWN0b3JpbmdVbml0IGdldFRoZW4oKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5Db25kaXRpb25hbFVuaXQjZ2V0VGhlbiA8ZW0+VGhlbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGhlbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldFRoZW4oKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFRoZW4oUmVmYWN0b3JpbmdVbml0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsc2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsc2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRFbHNlKFJlZmFjdG9yaW5nVW5pdCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDb25kaXRpb25hbFVuaXRfRWxzZSgpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5jb21wYXJ0bWVudCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVJlZmFjdG9yaW5nVW5pdCBnZXRFbHNlKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuQ29uZGl0aW9uYWxVbml0I2dldEVsc2UgPGVtPkVsc2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsc2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRFbHNlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRFbHNlKFJlZmFjdG9yaW5nVW5pdCB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuSW5wdXRQb3J0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldENvbmRpdGlvbmFsVW5pdF9JbnB1dFBvcnRzKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5hZmZpeGVkIGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUxpc3Q8SW5wdXRQb3J0PiBnZXRJbnB1dFBvcnRzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJDb25kaXRpb25hbCBVbml0IjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRDb25kaXRpb25hbFVuaXRfVHlwZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJDb25kaXRpb25hbCBVbml0IiBjaGFuZ2VhYmxlPSJmYWxzZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFR5cGUoKTsNCisNCit9IC8vIENvbmRpdGlvbmFsVW5pdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9EZXNjcmliZWRFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvRGVzY3JpYmVkRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZmE3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvRGVzY3JpYmVkRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpYmVkIEVsZW1lbnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkRlc2NyaWJlZEVsZW1lbnQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0RGVzY3JpYmVkRWxlbWVudCgpDQorICogQG1vZGVsIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmVkRWxlbWVudCBleHRlbmRzIEVPYmplY3Qgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXREZXNjcmliZWRFbGVtZW50X0Rlc2NyaXB0aW9uKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkRlc2NyaWJlZEVsZW1lbnQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOw0KKw0KK30gLy8gRGVzY3JpYmVkRWxlbWVudA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9GZWF0dXJlSGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvRmVhdHVyZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGMzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvRmVhdHVyZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZlYXR1cmUgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5GZWF0dXJlSGVscGVyI2dldElucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5GZWF0dXJlSGVscGVyI2dldFNlY29uZGFyeUlucHV0UG9ydHMgPGVtPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEZlYXR1cmVIZWxwZXIoKQ0KKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBGZWF0dXJlSGVscGVyIGV4dGVuZHMgSGVscGVyIHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklucHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklucHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEZlYXR1cmVIZWxwZXJfSW5wdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlSW5wdXRQb3J0IGdldElucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkZlYXR1cmVIZWxwZXIjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0SW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuTXVsdGlJbnB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRGZWF0dXJlSGVscGVyX1NlY29uZGFyeUlucHV0UG9ydHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PE11bHRpSW5wdXRQb3J0PiBnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCk7DQorDQorfSAvLyBGZWF0dXJlSGVscGVyDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0ZlYXR1cmVVbml0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvRmVhdHVyZVVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWI2MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0ZlYXR1cmVVbml0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZlYXR1cmUgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0RmVhdHVyZVVuaXQoKQ0KKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBGZWF0dXJlVW5pdCBleHRlbmRzIEhlbHBlclVuaXQgew0KK30gLy8gRmVhdHVyZVVuaXQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvRmlsdGVySGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvRmlsdGVySGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmY2VkMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9GaWx0ZXJIZWxwZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsdGVyIEhlbHBlcjwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuRmlsdGVySGVscGVyI2dldElucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEZpbHRlckhlbHBlcigpDQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEZpbHRlckhlbHBlciBleHRlbmRzIEhlbHBlciB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0SW5wdXRQb3J0KE11bHRpSW5wdXRQb3J0KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEZpbHRlckhlbHBlcl9JbnB1dFBvcnQoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlNdWx0aUlucHV0UG9ydCBnZXRJbnB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5GaWx0ZXJIZWxwZXIjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0SW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRJbnB1dFBvcnQoTXVsdGlJbnB1dFBvcnQgdmFsdWUpOw0KKw0KK30gLy8gRmlsdGVySGVscGVyDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0ZpbHRlclVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9GaWx0ZXJVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2OGNmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9GaWx0ZXJVbml0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpbHRlciBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRGaWx0ZXJVbml0KCkNCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRmlsdGVyVW5pdCBleHRlbmRzIEhlbHBlclVuaXQgew0KK30gLy8gRmlsdGVyVW5pdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9IZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmFhZDgyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWxwZXI8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkhlbHBlciNnZXRIZWxwZXJJZCA8ZW0+SGVscGVyIElkPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkhlbHBlciNnZXROYW1lc3BhY2VVcmkgPGVtPk5hbWVzcGFjZSBVcmk8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRIZWxwZXIoKQ0KKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBIZWxwZXIgZXh0ZW5kcyBOYW1lZEVsZW1lbnQsIERlc2NyaWJlZEVsZW1lbnQgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVscGVyIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWxwZXIgSWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlbHBlciBJZDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEhlbHBlcklkKFN0cmluZykNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRIZWxwZXJfSGVscGVySWQoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRIZWxwZXJJZCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLkhlbHBlciNnZXRIZWxwZXJJZCA8ZW0+SGVscGVyIElkPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWxwZXIgSWQ8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRIZWxwZXJJZCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0SGVscGVySWQoU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXROYW1lc3BhY2VVcmkoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEhlbHBlcl9OYW1lc3BhY2VVcmkoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXROYW1lc3BhY2VVcmkoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5IZWxwZXIjZ2V0TmFtZXNwYWNlVXJpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVXJpPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0TmFtZXNwYWNlVXJpKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXROYW1lc3BhY2VVcmkoU3RyaW5nIHZhbHVlKTsNCisNCit9IC8vIEhlbHBlcg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9IZWxwZXJVbml0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvSGVscGVyVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjZlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvSGVscGVyVW5pdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWxwZXIgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuSGVscGVyVW5pdCNnZXRIZWxwZXJVbml0SWQgPGVtPkhlbHBlciBVbml0IElkPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLkhlbHBlclVuaXQjZ2V0TmFtZXNwYWNlVXJpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0SGVscGVyVW5pdCgpDQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEhlbHBlclVuaXQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQsIERlc2NyaWJlZEVsZW1lbnQgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVscGVyIFVuaXQgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlbHBlciBVbml0IElkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWxwZXIgVW5pdCBJZDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldEhlbHBlclVuaXRJZChTdHJpbmcpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0SGVscGVyVW5pdF9IZWxwZXJVbml0SWQoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRIZWxwZXJVbml0SWQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5IZWxwZXJVbml0I2dldEhlbHBlclVuaXRJZCA8ZW0+SGVscGVyIFVuaXQgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlbHBlciBVbml0IElkPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0SGVscGVyVW5pdElkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRIZWxwZXJVbml0SWQoU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXROYW1lc3BhY2VVcmkoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldEhlbHBlclVuaXRfTmFtZXNwYWNlVXJpKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuSGVscGVyVW5pdCNnZXROYW1lc3BhY2VVcmkgPGVtPk5hbWVzcGFjZSBVcmk8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVcmk8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE5hbWVzcGFjZVVyaShTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQG1vZGVsIGtpbmQ9Im9wZXJhdGlvbiIgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU91dHB1dFBvcnQgZ2V0T3V0cHV0UG9ydCgpOw0KKw0KK30gLy8gSGVscGVyVW5pdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9JbnB1dFBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9JbnB1dFBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGVjY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL0lucHV0UG9ydC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRJbnB1dFBvcnQoKQ0KKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSINCisgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLm5vZGUgZmlndXJlPSdyZWN0YW5nbGUnIHNpemU9JzIwLDIwJyINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBJbnB1dFBvcnQgZXh0ZW5kcyBQb3J0IHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlCb29sZWFuIGlzTWFwcGluZ1RhcmdldCgpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUJvb2xlYW4gaXNSb290UG9ydCgpOw0KKw0KK30gLy8gSW5wdXRQb3J0DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL01hcHBpbmdWaXN1YWxpemF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTWFwcGluZ1Zpc3VhbGl6YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTBiZWIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL01hcHBpbmdWaXN1YWxpemF0aW9uLmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9iPjwvZW0+JywNCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uKCkNCisgKiBAbW9kZWwNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGVudW0gTWFwcGluZ1Zpc3VhbGl6YXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsNCisJLyoqDQorCSAqIFRoZSAnPGVtPjxiPkFycm93czwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNBUlJPV1NfVkFMVUUNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJQVJST1dTKDAsICJhcnJvd3MiLCAiYXJyb3dzIiksDQorDQorCS8qKg0KKwkgKiBUaGUgJzxlbT48Yj5Db2xvcmVkIFBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI0NPTE9SRURfUE9SVFNfVkFMVUUNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJQ09MT1JFRF9QT1JUUygxLCAiY29sb3JlZFBvcnRzIiwgImNvbG9yZWRQb3J0cyIpLA0KKw0KKwkvKioNCisJICogVGhlICc8ZW0+PGI+SW5kaWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNJTkRJQ0VTX1ZBTFVFDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCUlORElDRVMoMiwgImluZGljZXMiLCAiaW5kaWNlcyIpLA0KKw0KKwkvKioNCisJICogVGhlICc8ZW0+PGI+QXJyb3dzIEFuZCBDb2xvcmVkIFBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI0FSUk9XU19BTkRfQ09MT1JFRF9QT1JUU19WQUxVRQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlBUlJPV1NfQU5EX0NPTE9SRURfUE9SVFMoMywgImFycm93c0FuZENvbG9yZWRQb3J0cyIsICJhcnJvd3NBbmRDb2xvcmVkUG9ydHMiKSwNCisNCisJLyoqDQorCSAqIFRoZSAnPGVtPjxiPkFycm93cyBBbmQgSW5kaWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNBUlJPV1NfQU5EX0lORElDRVNfVkFMVUUNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJQVJST1dTX0FORF9JTkRJQ0VTKDQsICJhcnJvd3NBbmRJbmRpY2VzIiwgImFycm93c0FuZEluZGljZXMiKTsNCisNCisJLyoqDQorCSAqIFRoZSAnPGVtPjxiPkFycm93czwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QXJyb3dzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNBUlJPV1MNCisJICogQG1vZGVsIG5hbWU9ImFycm93cyINCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJST1dTX1ZBTFVFID0gMDsNCisNCisJLyoqDQorCSAqIFRoZSAnPGVtPjxiPkNvbG9yZWQgUG9ydHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbG9yZWQgUG9ydHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI0NPTE9SRURfUE9SVFMNCisJICogQG1vZGVsIG5hbWU9ImNvbG9yZWRQb3J0cyINCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JFRF9QT1JUU19WQUxVRSA9IDE7DQorDQorCS8qKg0KKwkgKiBUaGUgJzxlbT48Yj5JbmRpY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JbmRpY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNJTkRJQ0VTDQorCSAqIEBtb2RlbCBuYW1lPSJpbmRpY2VzIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkRJQ0VTX1ZBTFVFID0gMjsNCisNCisJLyoqDQorCSAqIFRoZSAnPGVtPjxiPkFycm93cyBBbmQgQ29sb3JlZCBQb3J0czwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QXJyb3dzIEFuZCBDb2xvcmVkIFBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNBUlJPV1NfQU5EX0NPTE9SRURfUE9SVFMNCisJICogQG1vZGVsIG5hbWU9ImFycm93c0FuZENvbG9yZWRQb3J0cyINCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJST1dTX0FORF9DT0xPUkVEX1BPUlRTX1ZBTFVFID0gMzsNCisNCisJLyoqDQorCSAqIFRoZSAnPGVtPjxiPkFycm93cyBBbmQgSW5kaWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QXJyb3dzIEFuZCBJbmRpY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNBUlJPV1NfQU5EX0lORElDRVMNCisJICogQG1vZGVsIG5hbWU9ImFycm93c0FuZEluZGljZXMiDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUk9XU19BTkRfSU5ESUNFU19WQUxVRSA9IDQ7DQorDQorCS8qKg0KKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcHBpbmdWaXN1YWxpemF0aW9uW10gVkFMVUVTX0FSUkFZID0NCisJCW5ldyBNYXBwaW5nVmlzdWFsaXphdGlvbltdIHsNCisJCQlBUlJPV1MsDQorCQkJQ09MT1JFRF9QT1JUUywNCisJCQlJTkRJQ0VTLA0KKwkJCUFSUk9XU19BTkRfQ09MT1JFRF9QT1JUUywNCisJCQlBUlJPV1NfQU5EX0lORElDRVMsDQorCQl9Ow0KKw0KKwkvKioNCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk1hcHBpbmcgVmlzdWFsaXphdGlvbjwvYj48L2VtPicgZW51bWVyYXRvcnMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TWFwcGluZ1Zpc3VhbGl6YXRpb24+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBNYXBwaW5nVmlzdWFsaXphdGlvbiBnZXQoU3RyaW5nIGxpdGVyYWwpIHsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7DQorCQkJTWFwcGluZ1Zpc3VhbGl6YXRpb24gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIE1hcHBpbmdWaXN1YWxpemF0aW9uIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgew0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsNCisJCQlNYXBwaW5nVmlzdWFsaXphdGlvbiByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQorCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBNYXBwaW5nVmlzdWFsaXphdGlvbiBnZXQoaW50IHZhbHVlKSB7DQorCQlzd2l0Y2ggKHZhbHVlKSB7DQorCQkJY2FzZSBBUlJPV1NfVkFMVUU6IHJldHVybiBBUlJPV1M7DQorCQkJY2FzZSBDT0xPUkVEX1BPUlRTX1ZBTFVFOiByZXR1cm4gQ09MT1JFRF9QT1JUUzsNCisJCQljYXNlIElORElDRVNfVkFMVUU6IHJldHVybiBJTkRJQ0VTOw0KKwkJCWNhc2UgQVJST1dTX0FORF9DT0xPUkVEX1BPUlRTX1ZBTFVFOiByZXR1cm4gQVJST1dTX0FORF9DT0xPUkVEX1BPUlRTOw0KKwkJCWNhc2UgQVJST1dTX0FORF9JTkRJQ0VTX1ZBTFVFOiByZXR1cm4gQVJST1dTX0FORF9JTkRJQ0VTOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7DQorDQorCS8qKg0KKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIE1hcHBpbmdWaXN1YWxpemF0aW9uKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7DQorCQl0aGlzLnZhbHVlID0gdmFsdWU7DQorCQl0aGlzLm5hbWUgPSBuYW1lOw0KKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7DQorCSAgcmV0dXJuIHZhbHVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKwkgIHJldHVybiBuYW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgew0KKwkgIHJldHVybiBsaXRlcmFsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlyZXR1cm4gbGl0ZXJhbDsNCisJfQ0KKwkNCit9IC8vTWFwcGluZ1Zpc3VhbGl6YXRpb24NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTW9kZWxSZWZhY3RvcmluZy5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL01vZGVsUmVmYWN0b3JpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkyODA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL01vZGVsUmVmYWN0b3JpbmcuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kZWwgUmVmYWN0b3Jpbmc8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0UmVmSWQgPGVtPlJlZiBJZDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nI2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nI2dldE5hbWVzcGFjZVVyaSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nI2dldElucHV0UG9ydHMgPGVtPklucHV0IFBvcnRzPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TW9kZWxSZWZhY3RvcmluZygpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTW9kZWxSZWZhY3RvcmluZyBleHRlbmRzIE5hbWVkRWxlbWVudCwgRGVzY3JpYmVkRWxlbWVudCB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWYgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZiBJZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIElkPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0UmVmSWQoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE1vZGVsUmVmYWN0b3JpbmdfUmVmSWQoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRSZWZJZCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0UmVmSWQgPGVtPlJlZiBJZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmIElkPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0UmVmSWQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFJlZklkKFN0cmluZyB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGFiZWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhYmVsPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0TGFiZWwoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE1vZGVsUmVmYWN0b3JpbmdfTGFiZWwoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRMYWJlbCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldExhYmVsKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRMYWJlbChTdHJpbmcgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVyaTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldE5hbWVzcGFjZVVyaShTdHJpbmcpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TW9kZWxSZWZhY3RvcmluZ19OYW1lc3BhY2VVcmkoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXROYW1lc3BhY2VVcmkoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nI2dldE5hbWVzcGFjZVVyaSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldE5hbWVzcGFjZVVyaSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0TmFtZXNwYWNlVXJpKFN0cmluZyB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuU2luZ2xlSW5wdXRQb3J0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE1vZGVsUmVmYWN0b3JpbmdfSW5wdXRQb3J0cygpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUxpc3Q8U2luZ2xlSW5wdXRQb3J0PiBnZXRJbnB1dFBvcnRzKCk7DQorDQorfSAvLyBNb2RlbFJlZmFjdG9yaW5nDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL011bHRpRmVhdHVyZUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL011bHRpRmVhdHVyZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Mjk3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlGZWF0dXJlSGVscGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIEZlYXR1cmUgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXIjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aUZlYXR1cmVIZWxwZXIoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpRmVhdHVyZUhlbHBlciBleHRlbmRzIEZlYXR1cmVIZWxwZXIgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldE91dHB1dFBvcnQoTXVsdGlPdXRwdXRQb3J0KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpRmVhdHVyZUhlbHBlcl9PdXRwdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXIjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQgdmFsdWUpOw0KKw0KK30gLy8gTXVsdGlGZWF0dXJlSGVscGVyDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL011bHRpRmVhdHVyZVVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aUZlYXR1cmVVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjYmMwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aUZlYXR1cmVVbml0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIEZlYXR1cmUgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCNnZXRJbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCNnZXRTZWNvbmRhcnlJbnB1dFBvcnRzIDxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0I2dldE11bHRpRmVhdHVyZUhlbHBlciA8ZW0+TXVsdGkgRmVhdHVyZSBIZWxwZXI8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TXVsdGlGZWF0dXJlVW5pdCgpDQorICogQG1vZGVsIGFubm90YXRpb249ImdtZi5ub2RlIGZvbz0nYmFyJyBsYWJlbC5pY29uPSdmYWxzZScgbGFiZWw9J25hbWUsdHlwZScgbGFiZWwucGF0dGVybj0nezB9OnsxfSciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTXVsdGlGZWF0dXJlVW5pdCBleHRlbmRzIEZlYXR1cmVVbml0IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklucHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklucHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpRmVhdHVyZVVuaXRfSW5wdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5hZmZpeGVkIGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlSW5wdXRQb3J0IGdldElucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0SW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuTXVsdGlJbnB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aUZlYXR1cmVVbml0X1NlY29uZGFyeUlucHV0UG9ydHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuYWZmaXhlZCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PE11bHRpSW5wdXRQb3J0PiBnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TXVsdGlGZWF0dXJlVW5pdF9PdXRwdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5hZmZpeGVkIGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0I2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE91dHB1dFBvcnQoTXVsdGlPdXRwdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11bHRpIEZlYXR1cmUgSGVscGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGkgRmVhdHVyZSBIZWxwZXI8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRNdWx0aUZlYXR1cmVIZWxwZXIoTXVsdGlGZWF0dXJlSGVscGVyKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpRmVhdHVyZVVuaXRfTXVsdGlGZWF0dXJlSGVscGVyKCkNCisJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlNdWx0aUZlYXR1cmVIZWxwZXIgZ2V0TXVsdGlGZWF0dXJlSGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdCNnZXRNdWx0aUZlYXR1cmVIZWxwZXIgPGVtPk11bHRpIEZlYXR1cmUgSGVscGVyPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldE11bHRpRmVhdHVyZUhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0TXVsdGlGZWF0dXJlSGVscGVyKE11bHRpRmVhdHVyZUhlbHBlciB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJNdWx0aSBGZWF0dXJlIFVuaXQiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpRmVhdHVyZVVuaXRfVHlwZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJNdWx0aSBGZWF0dXJlIFVuaXQiIGNoYW5nZWFibGU9ImZhbHNlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0VHlwZSgpOw0KKw0KK30gLy8gTXVsdGlGZWF0dXJlVW5pdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aUZpbHRlckhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL011bHRpRmlsdGVySGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5YzQxMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aUZpbHRlckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBGaWx0ZXIgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlciNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpRmlsdGVySGVscGVyKCkNCisgKiBAbW9kZWwNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBNdWx0aUZpbHRlckhlbHBlciBleHRlbmRzIEZpbHRlckhlbHBlciB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TXVsdGlGaWx0ZXJIZWxwZXJfT3V0cHV0UG9ydCgpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXIjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQgdmFsdWUpOw0KKw0KK30gLy8gTXVsdGlGaWx0ZXJIZWxwZXINCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlGaWx0ZXJVbml0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlGaWx0ZXJVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwNTY5MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aUZpbHRlclVuaXQuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIEZpbHRlciBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlclVuaXQjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLk11bHRpRmlsdGVyVW5pdCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlclVuaXQjZ2V0TXVsdGlGaWx0ZXJIZWxwZXIgPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJVbml0I2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aUZpbHRlclVuaXQoKQ0KKyAqIEBtb2RlbCBhbm5vdGF0aW9uPSJnbWYubm9kZSBmb289J2JhcicgbGFiZWwuaWNvbj0nZmFsc2UnIGxhYmVsPSduYW1lLHR5cGUnIGxhYmVsLnBhdHRlcm49J3swfTp7MX0nIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpRmlsdGVyVW5pdCBleHRlbmRzIEZpbHRlclVuaXQgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5wdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5wdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldElucHV0UG9ydChNdWx0aUlucHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aUZpbHRlclVuaXRfSW5wdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5hZmZpeGVkIGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJVbml0I2dldElucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5wdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldElucHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0SW5wdXRQb3J0KE11bHRpSW5wdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRPdXRwdXRQb3J0KE11bHRpT3V0cHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aUZpbHRlclVuaXRfT3V0cHV0UG9ydCgpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuYWZmaXhlZCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJVbml0I2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE91dHB1dFBvcnQoTXVsdGlPdXRwdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11bHRpIEZpbHRlciBIZWxwZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRNdWx0aUZpbHRlckhlbHBlcihNdWx0aUZpbHRlckhlbHBlcikNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aUZpbHRlclVuaXRfTXVsdGlGaWx0ZXJIZWxwZXIoKQ0KKwkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpRmlsdGVySGVscGVyIGdldE11bHRpRmlsdGVySGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuTXVsdGlGaWx0ZXJVbml0I2dldE11bHRpRmlsdGVySGVscGVyIDxlbT5NdWx0aSBGaWx0ZXIgSGVscGVyPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aSBGaWx0ZXIgSGVscGVyPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE11bHRpRmlsdGVySGVscGVyKE11bHRpRmlsdGVySGVscGVyIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ik11bHRpIEZpbHRlciBVbml0IjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aUZpbHRlclVuaXRfVHlwZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJNdWx0aSBGaWx0ZXIgVW5pdCIgY2hhbmdlYWJsZT0iZmFsc2UiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRUeXBlKCk7DQorDQorfSAvLyBNdWx0aUZpbHRlclVuaXQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlJbnB1dFBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aUlucHV0UG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzE3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlJbnB1dFBvcnQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgSW5wdXQgUG9ydDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TXVsdGlJbnB1dFBvcnQoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpSW5wdXRQb3J0IGV4dGVuZHMgTXVsdGlQb3J0LCBJbnB1dFBvcnQgew0KK30gLy8gTXVsdGlJbnB1dFBvcnQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlPdXRwdXRQb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlPdXRwdXRQb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxOGVhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aU91dHB1dFBvcnQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgT3V0cHV0IFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpT3V0cHV0UG9ydCgpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTXVsdGlPdXRwdXRQb3J0IGV4dGVuZHMgTXVsdGlQb3J0LCBPdXRwdXRQb3J0IHsNCit9IC8vIE11bHRpT3V0cHV0UG9ydA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aVBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aVBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc0NzYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL011bHRpUG9ydC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLk11bHRpUG9ydCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aVBvcnQoKQ0KKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSINCisgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLm5vZGUgYm9yZGVyLmNvbG9yPScyNTUsMCwwJyBib3JkZXIud2lkdGg9JzEwJyINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBNdWx0aVBvcnQgZXh0ZW5kcyBQb3J0IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4NCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5PYmplY3R9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TXVsdGlQb3J0X1ZhbHVlKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PE9iamVjdD4gZ2V0VmFsdWUoKTsNCisNCit9IC8vIE11bHRpUG9ydA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aVBvcnRNYXBwaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlQb3J0TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4N2M2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlQb3J0TWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBQb3J0IE1hcHBpbmc8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLk11bHRpUG9ydE1hcHBpbmcjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuTXVsdGlQb3J0TWFwcGluZyNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpUG9ydE1hcHBpbmcoKQ0KKyAqIEBtb2RlbCBhbm5vdGF0aW9uPSJnbWYubGluayBzb3VyY2U9J3NvdXJjZScgdGFyZ2V0PSd0YXJnZXQnIHN0eWxlPSdkb3QnIHdpZHRoPScyJyB0YXJnZXQuZGVjb3JhdGlvbj0nYXJyb3cnIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpUG9ydE1hcHBpbmcgZXh0ZW5kcyBQb3J0TWFwcGluZyB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0U291cmNlKE11bHRpUG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aVBvcnRNYXBwaW5nX1NvdXJjZSgpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlNdWx0aVBvcnQgZ2V0U291cmNlKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuTXVsdGlQb3J0TWFwcGluZyNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0U291cmNlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRTb3VyY2UoTXVsdGlQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldDwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRUYXJnZXQoTXVsdGlJbnB1dFBvcnQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TXVsdGlQb3J0TWFwcGluZ19UYXJnZXQoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlJbnB1dFBvcnQgZ2V0VGFyZ2V0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuTXVsdGlQb3J0TWFwcGluZyNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0PC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0VGFyZ2V0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRUYXJnZXQoTXVsdGlJbnB1dFBvcnQgdmFsdWUpOw0KKw0KK30gLy8gTXVsdGlQb3J0TWFwcGluZw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlTaW5nbGVQb3J0TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWU5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTXVsdGlTaW5nbGVQb3J0TWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBTaW5nbGUgUG9ydCBNYXBwaW5nPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLk11bHRpU2luZ2xlUG9ydE1hcHBpbmcjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKCkNCisgKiBAbW9kZWwgYW5ub3RhdGlvbj0iZ21mLmxpbmsgc291cmNlPSdzb3VyY2UnIHRhcmdldD0ndGFyZ2V0JyBzdHlsZT0nZG90JyB3aWR0aD0nMicgdGFyZ2V0LmRlY29yYXRpb249J2Fycm93JyB0b29sLnNtYWxsLmJ1bmRsZT0nbmFtZSciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTXVsdGlTaW5nbGVQb3J0TWFwcGluZyBleHRlbmRzIFBvcnRNYXBwaW5nIHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRTb3VyY2UoTXVsdGlQb3J0KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfU291cmNlKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpUG9ydCBnZXRTb3VyY2UoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRTb3VyY2UoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFNvdXJjZShNdWx0aVBvcnQgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldFRhcmdldChTaW5nbGVJbnB1dFBvcnQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZ19UYXJnZXQoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlSW5wdXRQb3J0IGdldFRhcmdldCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLk11bHRpU2luZ2xlUG9ydE1hcHBpbmcjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldFRhcmdldCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0VGFyZ2V0KFNpbmdsZUlucHV0UG9ydCB2YWx1ZSk7DQorDQorfSAvLyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL05hbWVkRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL05hbWVkRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzI5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvTmFtZWRFbGVtZW50LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldE5hbWVkRWxlbWVudCgpDQorICogQG1vZGVsIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgTmFtZWRFbGVtZW50IGV4dGVuZHMgRU9iamVjdCB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0TmFtZShTdHJpbmcpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0TmFtZWRFbGVtZW50X05hbWUoKQ0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldE5hbWUoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldE5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsNCisNCit9IC8vIE5hbWVkRWxlbWVudA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9PdXRwdXRQb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvT3V0cHV0UG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZjM5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvT3V0cHV0UG9ydC5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0T3V0cHV0UG9ydCgpDQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIg0KKyAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYubm9kZSBmaWd1cmU9J2VsbGlwc2UnIHNpemU9JzIwLDIwJyINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBPdXRwdXRQb3J0IGV4dGVuZHMgUG9ydCB7DQorfSAvLyBPdXRwdXRQb3J0DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1BhcmFsbGVsUXVldWVkVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGQyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvUGFyYWxsZWxRdWV1ZWRVbml0LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcmFsbGVsIFF1ZXVlZCBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0SGVscGVyVW5pdHMgPGVtPkhlbHBlciBVbml0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0cyA8ZW0+UmVmYWN0b3JpbmcgVW5pdHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0I2dldFNpbmdsZUlucHV0UG9ydHMgPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0TXVsdGlJbnB1dFBvcnRzIDxlbT5NdWx0aSBJbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkNCisgKiBAbW9kZWwgYW5ub3RhdGlvbj0iZ21mLm5vZGUgZm9vPSdiYXInIGxhYmVsLmljb249J2ZhbHNlJyBsYWJlbD0nbmFtZSx0eXBlLGxibFN0cmljdCcgbGFiZWwucGF0dGVybj0nezB9OnsxfSAtezJ9LSciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgUGFyYWxsZWxRdWV1ZWRVbml0IGV4dGVuZHMgVHdpY2VkUXVldWVkVW5pdCB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IZWxwZXIgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgY29tcmVsLkhlbHBlclVuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVscGVyIFVuaXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlbHBlciBVbml0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuY29tcGFydG1lbnQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxIZWxwZXJVbml0PiBnZXRIZWxwZXJVbml0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmYWN0b3JpbmcgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmFjdG9yaW5nIFVuaXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZhY3RvcmluZyBVbml0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldFJlZmFjdG9yaW5nVW5pdHMoUmVmYWN0b3JpbmdVbml0KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFBhcmFsbGVsUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXRzKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5jb21wYXJ0bWVudCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVJlZmFjdG9yaW5nVW5pdCBnZXRSZWZhY3RvcmluZ1VuaXRzKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuUGFyYWxsZWxRdWV1ZWRVbml0I2dldFJlZmFjdG9yaW5nVW5pdHMgPGVtPlJlZmFjdG9yaW5nIFVuaXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZhY3RvcmluZyBVbml0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldFJlZmFjdG9yaW5nVW5pdHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFJlZmFjdG9yaW5nVW5pdHMoUmVmYWN0b3JpbmdVbml0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpbmdsZSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuU2luZ2xlSW5wdXRQb3J0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaW5nbGUgSW5wdXQgUG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuYWZmaXhlZCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PFNpbmdsZUlucHV0UG9ydD4gZ2V0U2luZ2xlSW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGkgSW5wdXQgUG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgY29tcmVsLk11bHRpSW5wdXRQb3J0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11bHRpIElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpIElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFBhcmFsbGVsUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIGxvd2VyPSIyIiB1cHBlcj0iMiINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5hZmZpeGVkIGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUxpc3Q8TXVsdGlJbnB1dFBvcnQ+IGdldE11bHRpSW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iUGFyYWxsZWwgUXVldWVkIFVuaXQiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFBhcmFsbGVsUXVldWVkVW5pdF9UeXBlKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IlBhcmFsbGVsIFF1ZXVlZCBVbml0IiBjaGFuZ2VhYmxlPSJmYWxzZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFR5cGUoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxibCBTdHJpY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InN0cmljdCI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGJsIFN0cmljdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGJsIFN0cmljdDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldExibFN0cmljdChTdHJpbmcpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0xibFN0cmljdCgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJzdHJpY3QiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRMYmxTdHJpY3QoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYmwgU3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0TGJsU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRMYmxTdHJpY3QoU3RyaW5nIHZhbHVlKTsNCisNCit9IC8vIFBhcmFsbGVsUXVldWVkVW5pdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Qb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvUG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDc0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvUG9ydC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlBvcnQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFBvcnQoKQ0KKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSINCisgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLm5vZGUgZm9vPSdiYXInIGxhYmVsPSduYW1lLHR5cGUnIGxhYmVsLmljb249J2ZhbHNlJyBsYWJlbC5wbGFjZW1lbnQ9J2V4dGVybmFsJyBsYWJlbC5wYXR0ZXJuPSd7MH06ezF9JyINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBQb3J0IGV4dGVuZHMgTmFtZWRFbGVtZW50LCBEZXNjcmliZWRFbGVtZW50IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRUeXBlKENsYXNzKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFBvcnRfVHlwZSgpDQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQ2xhc3MgZ2V0VHlwZSgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLlBvcnQjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFR5cGUoQ2xhc3MgdmFsdWUpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFR5cGUoQ2xhc3MgbmV3VHlwZSwgYm9vbGVhbiBpbml0aWF0b3IpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHVwZGF0ZVBvcnROYW1lKFN0cmluZyBzaW5ndWxhclBvcnROYW1lKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0U2luZ3VsYXJQb3J0TmFtZSgpOw0KKwkNCisJcHVibGljIFNoYXBlIGdldEZpZ3VyZSgpOw0KKw0KKwlwdWJsaWMgdm9pZCBzZXRGaWd1cmUoU2hhcGUgZmlndXJlKTsNCisNCit9IC8vIFBvcnQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvUG9ydE1hcHBpbmcuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9Qb3J0TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjgwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvUG9ydE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgY29tcmVsLmZpZ3VyZXMuUG9ydE1hcHBpbmdGaWd1cmU7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE1hcHBpbmc8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFBvcnRNYXBwaW5nKCkNCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgUG9ydE1hcHBpbmcgZXh0ZW5kcyBFT2JqZWN0IHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlQb3J0IGdldFNvdXJjZSgpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUlucHV0UG9ydCBnZXRUYXJnZXQoKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCB1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyhDbGFzcyB0eXBlLCBTdHJpbmcgc2luZ3VsYXJQb3J0TmFtZSk7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgdXBkYXRlTWFwcGluZ051bWJlcigpOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHVwZGF0ZVZpc3VhbGl6YXRpb24oKTsNCisJDQorCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdOdW1iZXIoaW50IG1hcHBpbmdOdW1iZXIpOw0KKw0KKwlwdWJsaWMgaW50IGdldE1hcHBpbmdOdW1iZXIoKTsNCisJDQorCXB1YmxpYyB2b2lkIHNldEZpZ3VyZShQb3J0TWFwcGluZ0ZpZ3VyZSBmaWd1cmUpOw0KKw0KKwlwdWJsaWMgUG9ydE1hcHBpbmdGaWd1cmUgZ2V0RmlndXJlKCk7DQorCQ0KKwlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKTsNCisNCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpOw0KKw0KK30gLy8gUG9ydE1hcHBpbmcNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvUXVldWVkVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1F1ZXVlZFVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQzNzEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1F1ZXVlZFVuaXQuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UXVldWVkIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlF1ZXVlZFVuaXQjaXNTdHJpY3QgPGVtPlN0cmljdDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFF1ZXVlZFVuaXQoKQ0KKyAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSINCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBRdWV1ZWRVbml0IGV4dGVuZHMgQ29tcG9zaXRlVW5pdCB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJpY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cmljdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0U3RyaWN0KGJvb2xlYW4pDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0UXVldWVkVW5pdF9TdHJpY3QoKQ0KKwkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJYm9vbGVhbiBpc1N0cmljdCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLlF1ZXVlZFVuaXQjaXNTdHJpY3QgPGVtPlN0cmljdDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjaXNTdHJpY3QoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFN0cmljdChib29sZWFuIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBpbml0KCk7DQorDQorfSAvLyBRdWV1ZWRVbml0DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1JlZmFjdG9yaW5nVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1JlZmFjdG9yaW5nVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWJkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvUmVmYWN0b3JpbmdVbml0LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZmFjdG9yaW5nIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlJlZmFjdG9yaW5nVW5pdCNnZXRTZXFFeGVjdXRpb25PcmRlciA8ZW0+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFJlZmFjdG9yaW5nVW5pdCgpDQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFJlZmFjdG9yaW5nVW5pdCBleHRlbmRzIE5hbWVkRWxlbWVudCB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXEgRXhlY3V0aW9uIE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXEgRXhlY3V0aW9uIE9yZGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXEgRXhlY3V0aW9uIE9yZGVyPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0U2VxRXhlY3V0aW9uT3JkZXIoaW50KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFJlZmFjdG9yaW5nVW5pdF9TZXFFeGVjdXRpb25PcmRlcigpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlpbnQgZ2V0U2VxRXhlY3V0aW9uT3JkZXIoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQjZ2V0U2VxRXhlY3V0aW9uT3JkZXIgPGVtPlNlcSBFeGVjdXRpb24gT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcSBFeGVjdXRpb24gT3JkZXI8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRTZXFFeGVjdXRpb25PcmRlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0U2VxRXhlY3V0aW9uT3JkZXIoaW50IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxJbnB1dFBvcnQ+IGdldEFsbElucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRTZXFFeGVjdXRpb25PcmRlcihpbnQgc2VxRXhlY3V0aW9uT3JkZXIsIGJvb2xlYW4gc3VwZXJDYWxsKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lLCBib29sZWFuIHVwZGF0ZUNvbnRhaW5lcik7DQorCQ0KKwlwdWJsaWMgUm91bmRlZFJlY3RhbmdsZSBnZXRGaWd1cmUoKTsNCisNCisJcHVibGljIHZvaWQgc2V0RmlndXJlKFJvdW5kZWRSZWN0YW5nbGUgZmlndXJlKTsNCisNCit9IC8vIFJlZmFjdG9yaW5nVW5pdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NlcXVlbnRpYWxVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0NWRhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9TZXF1ZW50aWFsVW5pdC5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXF1ZW50aWFsIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNlcXVlbnRpYWxVbml0I2dldEhlbHBlclVuaXRzIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0cyA8ZW0+UmVmYWN0b3JpbmcgVW5pdHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjaXNTdHJpY3QgPGVtPlN0cmljdDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5TZXF1ZW50aWFsVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNlcXVlbnRpYWxVbml0I2dldExibFN0cmljdCA8ZW0+TGJsIFN0cmljdDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNlcXVlbnRpYWxVbml0KCkNCisgKiBAbW9kZWwgYW5ub3RhdGlvbj0iZ21mLm5vZGUgZm9vPSdiYXInIGxhYmVsLmljb249J2ZhbHNlJyBsYWJlbD0nbmFtZSx0eXBlLGxibFN0cmljdCcgbGFiZWwucGF0dGVybj0nezB9OnsxfSAtezJ9LSciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU2VxdWVudGlhbFVuaXQgZXh0ZW5kcyBDb21wb3NpdGVVbml0IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuSGVscGVyVW5pdH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWxwZXIgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVscGVyIFVuaXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmNvbXBhcnRtZW50IGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJRUxpc3Q8SGVscGVyVW5pdD4gZ2V0SGVscGVyVW5pdHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmFjdG9yaW5nIFVuaXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGNvbXJlbC5SZWZhY3RvcmluZ1VuaXR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmYWN0b3JpbmcgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmYWN0b3JpbmcgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuY29tcGFydG1lbnQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxSZWZhY3RvcmluZ1VuaXQ+IGdldFJlZmFjdG9yaW5nVW5pdHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklucHV0IFBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGNvbXJlbC5JbnB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5wdXQgUG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5wdXQgUG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2VxdWVudGlhbFVuaXRfSW5wdXRQb3J0cygpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuYWZmaXhlZCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUVMaXN0PElucHV0UG9ydD4gZ2V0SW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJpY3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cmljdDwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgI3NldFN0cmljdChib29sZWFuKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNlcXVlbnRpYWxVbml0X1N0cmljdCgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlib29sZWFuIGlzU3RyaWN0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjaXNTdHJpY3QgPGVtPlN0cmljdDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjaXNTdHJpY3QoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFN0cmljdChib29sZWFuIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlNlcXVlbnRpYWwgVW5pdCI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2VxdWVudGlhbFVuaXRfVHlwZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJTZXF1ZW50aWFsIFVuaXQiIGNoYW5nZWFibGU9ImZhbHNlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0VHlwZSgpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGJsIFN0cmljdDwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ic3RyaWN0IjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYmwgU3RyaWN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYmwgU3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjc2V0TGJsU3RyaWN0KFN0cmluZykNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTZXF1ZW50aWFsVW5pdF9MYmxTdHJpY3QoKQ0KKwkgKiBAbW9kZWwgZGVmYXVsdD0ic3RyaWN0Ig0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTdHJpbmcgZ2V0TGJsU3RyaWN0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuU2VxdWVudGlhbFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYmwgU3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0TGJsU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRMYmxTdHJpY3QoU3RyaW5nIHZhbHVlKTsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAbW9kZWwNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCB1cGRhdGVTZXFFeGVjdXRpb25PcmRlcigpOw0KKw0KK30gLy8gU2VxdWVudGlhbFVuaXQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlRmVhdHVyZUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZlYXR1cmVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRjMGJhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZlYXR1cmVIZWxwZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyI2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcigpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU2luZ2xlRmVhdHVyZUhlbHBlciBleHRlbmRzIEZlYXR1cmVIZWxwZXIgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGZWF0dXJlSGVscGVyX091dHB1dFBvcnQoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTaW5nbGVPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyI2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCB2YWx1ZSk7DQorDQorfSAvLyBTaW5nbGVGZWF0dXJlSGVscGVyDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZlYXR1cmVVbml0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlRmVhdHVyZVVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIwZTMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZlYXR1cmVVbml0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbmdsZSBGZWF0dXJlIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0I2dldElucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5TaW5nbGVGZWF0dXJlVW5pdCNnZXRTZWNvbmRhcnlJbnB1dFBvcnRzIDxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0U2luZ2xlRmVhdHVyZUhlbHBlciA8ZW0+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0I2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGZWF0dXJlVW5pdCgpDQorICogQG1vZGVsIGFubm90YXRpb249ImdtZi5ub2RlIGZvbz0nYmFyJyBsYWJlbC5pY29uPSdmYWxzZScgbGFiZWw9J25hbWUsdHlwZScgbGFiZWwucGF0dGVybj0nezB9OnsxfSciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU2luZ2xlRmVhdHVyZVVuaXQgZXh0ZW5kcyBGZWF0dXJlVW5pdCB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0SW5wdXRQb3J0KFNpbmdsZUlucHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGZWF0dXJlVW5pdF9JbnB1dFBvcnQoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmFmZml4ZWQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTaW5nbGVJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0SW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuTXVsdGlJbnB1dFBvcnR9Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGZWF0dXJlVW5pdF9TZWNvbmRhcnlJbnB1dFBvcnRzKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmFmZml4ZWQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxNdWx0aUlucHV0UG9ydD4gZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGZWF0dXJlVW5pdF9PdXRwdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5hZmZpeGVkIGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0T3V0cHV0UG9ydChTaW5nbGVPdXRwdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpbmdsZSBGZWF0dXJlIEhlbHBlcjwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRTaW5nbGVGZWF0dXJlSGVscGVyKFNpbmdsZUZlYXR1cmVIZWxwZXIpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlRmVhdHVyZVVuaXRfU2luZ2xlRmVhdHVyZUhlbHBlcigpDQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlRmVhdHVyZUhlbHBlciBnZXRTaW5nbGVGZWF0dXJlSGVscGVyKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQjZ2V0U2luZ2xlRmVhdHVyZUhlbHBlciA8ZW0+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRTaW5nbGVGZWF0dXJlSGVscGVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRTaW5nbGVGZWF0dXJlSGVscGVyKFNpbmdsZUZlYXR1cmVIZWxwZXIgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iU2luZ2xlIEZlYXR1cmUgVW5pdCI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlRmVhdHVyZVVuaXRfVHlwZSgpDQorCSAqIEBtb2RlbCBkZWZhdWx0PSJTaW5nbGUgRmVhdHVyZSBVbml0IiBjaGFuZ2VhYmxlPSJmYWxzZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFR5cGUoKTsNCisNCit9IC8vIFNpbmdsZUZlYXR1cmVVbml0DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZpbHRlckhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZpbHRlckhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDA5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlRmlsdGVySGVscGVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXIjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFNpbmdsZUZpbHRlckhlbHBlciBleHRlbmRzIEZpbHRlckhlbHBlciB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0T3V0cHV0UG9ydChTaW5nbGVPdXRwdXRQb3J0KQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNpbmdsZUZpbHRlckhlbHBlcl9PdXRwdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyI2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCB2YWx1ZSk7DQorDQorfSAvLyBTaW5nbGVGaWx0ZXJIZWxwZXINCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlRmlsdGVyVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZpbHRlclVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVkODI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZUZpbHRlclVuaXQuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbDsNCisNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbmdsZSBGaWx0ZXIgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdCNnZXRJbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0I2dldFNpbmdsZUZpbHRlckhlbHBlciA8ZW0+U2luZ2xlIEZpbHRlciBIZWxwZXI8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlRmlsdGVyVW5pdCgpDQorICogQG1vZGVsIGFubm90YXRpb249ImdtZi5ub2RlIGZvbz0nYmFyJyBsYWJlbC5pY29uPSdmYWxzZScgbGFiZWw9J25hbWUsdHlwZScgbGFiZWwucGF0dGVybj0nezB9OnsxfSciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU2luZ2xlRmlsdGVyVW5pdCBleHRlbmRzIEZpbHRlclVuaXQgew0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5wdXQgUG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5wdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5wdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldElucHV0UG9ydChNdWx0aUlucHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGaWx0ZXJVbml0X0lucHV0UG9ydCgpDQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuYWZmaXhlZCBmb289J2JhciciDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCU11bHRpSW5wdXRQb3J0IGdldElucHV0UG9ydCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0SW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRJbnB1dFBvcnQoTXVsdGlJbnB1dFBvcnQgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGaWx0ZXJVbml0X091dHB1dFBvcnQoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmFmZml4ZWQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlTaW5nbGVPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0I2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgUG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCB2YWx1ZSk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvYj48L2VtPicgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2luZ2xlIEZpbHRlciBIZWxwZXI8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0U2luZ2xlRmlsdGVySGVscGVyKFNpbmdsZUZpbHRlckhlbHBlcikNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGaWx0ZXJVbml0X1NpbmdsZUZpbHRlckhlbHBlcigpDQorCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU2luZ2xlRmlsdGVySGVscGVyIGdldFNpbmdsZUZpbHRlckhlbHBlcigpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLlNpbmdsZUZpbHRlclVuaXQjZ2V0U2luZ2xlRmlsdGVySGVscGVyIDxlbT5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2luZ2xlIEZpbHRlciBIZWxwZXI8L2VtPicgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNnZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldFNpbmdsZUZpbHRlckhlbHBlcihTaW5nbGVGaWx0ZXJIZWxwZXIgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iU2luZ2xlIEZpbHRlciBVbml0IjwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVGaWx0ZXJVbml0X1R5cGUoKQ0KKwkgKiBAbW9kZWwgZGVmYXVsdD0iU2luZ2xlIEZpbHRlciBVbml0IiBjaGFuZ2VhYmxlPSJmYWxzZSINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldFR5cGUoKTsNCisNCit9IC8vIFNpbmdsZUZpbHRlclVuaXQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlSW5wdXRQb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlSW5wdXRQb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwOGY1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9TaW5nbGVJbnB1dFBvcnQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIElucHV0IFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNpbmdsZUlucHV0UG9ydCgpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU2luZ2xlSW5wdXRQb3J0IGV4dGVuZHMgU2luZ2xlUG9ydCwgSW5wdXRQb3J0IHsNCit9IC8vIFNpbmdsZUlucHV0UG9ydA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9TaW5nbGVPdXRwdXRQb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlT3V0cHV0UG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjY2Y1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlT3V0cHV0UG9ydC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgT3V0cHV0IFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICoNCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNpbmdsZU91dHB1dFBvcnQoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFNpbmdsZU91dHB1dFBvcnQgZXh0ZW5kcyBTaW5nbGVQb3J0LCBPdXRwdXRQb3J0IHsNCit9IC8vIFNpbmdsZU91dHB1dFBvcnQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlUG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZVBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2NjYmQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZVBvcnQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqDQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNpbmdsZVBvcnQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUG9ydCgpDQorICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFNpbmdsZVBvcnQgZXh0ZW5kcyBQb3J0IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRWYWx1ZShPYmplY3QpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUG9ydF9WYWx1ZSgpDQorCSAqIEBtb2RlbA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlPYmplY3QgZ2V0VmFsdWUoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVQb3J0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNnZXRWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKTsNCisNCit9IC8vIFNpbmdsZVBvcnQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlUG9ydE1hcHBpbmcuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9TaW5nbGVQb3J0TWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDkwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvU2luZ2xlUG9ydE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIFBvcnQgTWFwcGluZzwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVQb3J0TWFwcGluZygpDQorICogQG1vZGVsIGFubm90YXRpb249ImdtZi5saW5rIHNvdXJjZT0nc291cmNlJyB0YXJnZXQ9J3RhcmdldCcgc3R5bGU9J2RvdCcgd2lkdGg9JzInIHRhcmdldC5kZWNvcmF0aW9uPSdhcnJvdyciDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgU2luZ2xlUG9ydE1hcHBpbmcgZXh0ZW5kcyBQb3J0TWFwcGluZyB7DQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjc2V0U291cmNlKFNpbmdsZVBvcnQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUG9ydE1hcHBpbmdfU291cmNlKCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNpbmdsZVBvcnQgZ2V0U291cmNlKCk7DQorDQorCS8qKg0KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI2dldFNvdXJjZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXZvaWQgc2V0U291cmNlKFNpbmdsZVBvcnQgdmFsdWUpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldFRhcmdldChTaW5nbGVJbnB1dFBvcnQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUG9ydE1hcHBpbmdfVGFyZ2V0KCkNCisJICogQG1vZGVsDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVNpbmdsZUlucHV0UG9ydCBnZXRUYXJnZXQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVQb3J0TWFwcGluZyNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0PC9lbT4nIHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0VGFyZ2V0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRUYXJnZXQoU2luZ2xlSW5wdXRQb3J0IHZhbHVlKTsNCisNCit9IC8vIFNpbmdsZVBvcnRNYXBwaW5nDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1NpbmdsZVF1ZXVlZFVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxNDI4ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9TaW5nbGVRdWV1ZWRVbml0LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbmdsZSBRdWV1ZWQgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlUXVldWVkVW5pdCNnZXRIZWxwZXJVbml0cyA8ZW0+SGVscGVyIFVuaXRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0IDxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0U2luZ2xlSW5wdXRQb3J0cyA8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0TXVsdGlJbnB1dFBvcnQgPGVtPk11bHRpIElucHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuU2luZ2xlUXVldWVkVW5pdCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUXVldWVkVW5pdCgpDQorICogQG1vZGVsIGFubm90YXRpb249ImdtZi5ub2RlIGZvbz0nYmFyJyBsYWJlbC5pY29uPSdmYWxzZScgbGFiZWw9J25hbWUsdHlwZSxsYmxTdHJpY3QnIGxhYmVsLnBhdHRlcm49J3swfTp7MX0gLXsyfS0nIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFNpbmdsZVF1ZXVlZFVuaXQgZXh0ZW5kcyBRdWV1ZWRVbml0IHsNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlbHBlciBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuSGVscGVyVW5pdH0uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDxwPg0KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWxwZXIgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVscGVyIFVuaXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiDQorCSAqICAgICAgICBhbm5vdGF0aW9uPSJnbWYuY29tcGFydG1lbnQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxIZWxwZXJVbml0PiBnZXRIZWxwZXJVbml0cygpOw0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmYWN0b3JpbmcgVW5pdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIEBzZWUgI3NldFJlZmFjdG9yaW5nVW5pdChSZWZhY3RvcmluZ1VuaXQpDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXQoKQ0KKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmNvbXBhcnRtZW50IGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJUmVmYWN0b3JpbmdVbml0IGdldFJlZmFjdG9yaW5nVW5pdCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0UmVmYWN0b3JpbmdVbml0IDxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0UmVmYWN0b3JpbmdVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRSZWZhY3RvcmluZ1VuaXQoUmVmYWN0b3JpbmdVbml0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpbmdsZSBJbnB1dCBQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBjb21yZWwuU2luZ2xlSW5wdXRQb3J0fS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKwkgKiA8L3A+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaW5nbGUgSW5wdXQgUG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUXVldWVkVW5pdF9TaW5nbGVJbnB1dFBvcnRzKCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KKwkgKiAgICAgICAgYW5ub3RhdGlvbj0iZ21mLmFmZml4ZWQgZm9vPSdiYXInIg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlFTGlzdDxTaW5nbGVJbnB1dFBvcnQ+IGdldFNpbmdsZUlucHV0UG9ydHMoKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11bHRpIElucHV0IFBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11bHRpIElucHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpIElucHV0IFBvcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiBAc2VlICNzZXRNdWx0aUlucHV0UG9ydChNdWx0aUlucHV0UG9ydCkNCisJICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCkNCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCisJICogICAgICAgIGFubm90YXRpb249ImdtZi5hZmZpeGVkIGZvbz0nYmFyJyINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJTXVsdGlJbnB1dFBvcnQgZ2V0TXVsdGlJbnB1dFBvcnQoKTsNCisNCisJLyoqDQorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0I2dldE11bHRpSW5wdXRQb3J0IDxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogQHNlZSAjZ2V0TXVsdGlJbnB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwl2b2lkIHNldE11bHRpSW5wdXRQb3J0KE11bHRpSW5wdXRQb3J0IHZhbHVlKTsNCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlNpbmdsZSBRdWV1ZWQgVW5pdCI8L2NvZGU+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8cD4NCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisJICogPC9wPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZ2V0U2luZ2xlUXVldWVkVW5pdF9UeXBlKCkNCisJICogQG1vZGVsIGRlZmF1bHQ9IlNpbmdsZSBRdWV1ZWQgVW5pdCIgY2hhbmdlYWJsZT0iZmFsc2UiDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCVN0cmluZyBnZXRUeXBlKCk7DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYmwgU3RyaWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJzdHJpY3QiPC9jb2RlPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPHA+DQorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxibCBTdHJpY3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorCSAqIDwvcD4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxibCBTdHJpY3Q8L2VtPicgYXR0cmlidXRlLg0KKwkgKiBAc2VlICNzZXRMYmxTdHJpY3QoU3RyaW5nKQ0KKwkgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlI2dldFNpbmdsZVF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkNCisJICogQG1vZGVsIGRlZmF1bHQ9InN0cmljdCINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJU3RyaW5nIGdldExibFN0cmljdCgpOw0KKw0KKwkvKioNCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYmwgU3RyaWN0PC9lbT4nIGF0dHJpYnV0ZS4NCisJICogQHNlZSAjZ2V0TGJsU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJdm9pZCBzZXRMYmxTdHJpY3QoU3RyaW5nIHZhbHVlKTsNCisNCit9IC8vIFNpbmdsZVF1ZXVlZFVuaXQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvVHdpY2VkUXVldWVkVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1R3aWNlZFF1ZXVlZFVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTZmOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL1R3aWNlZFF1ZXVlZFVuaXQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsOw0KKw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHdpY2VkIFF1ZXVlZCBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKg0KKyAqDQorICogQHNlZSBjb21yZWwuQ29tcmVsUGFja2FnZSNnZXRUd2ljZWRRdWV1ZWRVbml0KCkNCisgKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgVHdpY2VkUXVldWVkVW5pdCBleHRlbmRzIFF1ZXVlZFVuaXQgew0KK30gLy8gVHdpY2VkUXVldWVkVW5pdA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9leHRlbnNpb25zL0lNdWx0aUZlYXR1cmVIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9leHRlbnNpb25zL0lNdWx0aUZlYXR1cmVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmViZTdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2V4dGVuc2lvbnMvSU11bHRpRmVhdHVyZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmV4dGVuc2lvbnM7DQorDQoraW1wb3J0IGNvbXJlbC5NdWx0aU91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQorDQorLyoqDQorICogQGF1dGhvciBhcmVuZHQNCisgKg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgSU11bHRpRmVhdHVyZUhlbHBlciB7DQorCQ0KKwkNCisJDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCk7DQorCQ0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKTsNCisJDQorCXB1YmxpYyB2b2lkIHJ1bigpOw0KKw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZXh0ZW5zaW9ucy9JTXVsdGlGaWx0ZXJIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9leHRlbnNpb25zL0lNdWx0aUZpbHRlckhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzAyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZXh0ZW5zaW9ucy9JTXVsdGlGaWx0ZXJIZWxwZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioNCisgKiANCisgKi8NCitwYWNrYWdlIGNvbXJlbC5leHRlbnNpb25zOw0KKw0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aU91dHB1dFBvcnQ7DQorDQorLyoqDQorICogQGF1dGhvciBhcmVuZHQNCisgKg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgSU11bHRpRmlsdGVySGVscGVyIHsNCisJDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydCBnZXRJbnB1dFBvcnQoKTsNCisJDQorCXB1YmxpYyBNdWx0aU91dHB1dFBvcnQgZ2V0T3V0cHV0UG9ydCgpOw0KKwkNCisJcHVibGljIHZvaWQgcnVuKCk7DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9leHRlbnNpb25zL0lTaW5nbGVGZWF0dXJlSGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZXh0ZW5zaW9ucy9JU2luZ2xlRmVhdHVyZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTQxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZXh0ZW5zaW9ucy9JU2luZ2xlRmVhdHVyZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKg0KKyAqIA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmV4dGVuc2lvbnM7DQorDQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVPdXRwdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIEBhdXRob3IgYXJlbmR0DQorICoNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIElTaW5nbGVGZWF0dXJlSGVscGVyIHsNCisJDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCk7DQorCQ0KKwlwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCk7DQorCQ0KKwlwdWJsaWMgdm9pZCBydW4oKTsNCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2V4dGVuc2lvbnMvSVNpbmdsZUZpbHRlckhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2V4dGVuc2lvbnMvSVNpbmdsZUZpbHRlckhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzMwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZXh0ZW5zaW9ucy9JU2luZ2xlRmlsdGVySGVscGVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqDQorICogDQorICovDQorcGFja2FnZSBjb21yZWwuZXh0ZW5zaW9uczsNCisNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCisNCisvKioNCisgKiBAYXV0aG9yIGFyZW5kdA0KKyAqDQorICovDQorcHVibGljIGludGVyZmFjZSBJU2luZ2xlRmlsdGVySGVscGVyIHsNCisJDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydCBnZXRJbnB1dFBvcnQoKTsNCisJDQorCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKTsNCisJDQorCXB1YmxpYyB2b2lkIHJ1bigpOw0KKwkNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ZpZ3VyZXMvSW5wdXRQb3J0RmlndXJlLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZmlndXJlcy9JbnB1dFBvcnRGaWd1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTdlODRhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ZpZ3VyZXMvSW5wdXRQb3J0RmlndXJlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBjb21yZWwuZmlndXJlczsNCisNCisNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOw0KKw0KK2ltcG9ydCBjb21yZWwuSW5wdXRQb3J0Ow0KKw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgew0KKw0KKwlwcml2YXRlIElucHV0UG9ydCBwb3J0Ow0KKwlwcml2YXRlIExhYmVsIHBvcnRMYWJlbD1udWxsOw0KKw0KKwlwdWJsaWMgSW5wdXRQb3J0IGdldFBvcnQoKSB7DQorCQlyZXR1cm4gcG9ydDsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBzZXRQb3J0KElucHV0UG9ydCBwb3J0KSB7DQorCQl0aGlzLnBvcnQgPSBwb3J0Ow0KKwkJdGhpcy5wb3J0LnNldEZpZ3VyZSh0aGlzKTsNCisvLwkJdXBkYXRlRmlndXJlKCk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyB0ZXh0KXsNCisJCWlmKHBvcnRMYWJlbCA9PSBudWxsKSB7DQorCQkJcG9ydExhYmVsID0gbmV3IExhYmVsKCk7DQorCQkJcG9ydExhYmVsLnNldFNpemUodGhpcy5nZXRNaW5pbXVtU2l6ZSgpKTsNCisJCQl0aGlzLnJlbW92ZUFsbCgpOw0KKwkJCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKCk7DQorCQkJZmQuc2V0SGVpZ2h0KDUpOw0KKwkJCWZkLnNldFN0eWxlKFNXVC5OT1JNQUwpOw0KKwkJCUZvbnQgZiA9IG5ldyBGb250KG51bGwsIGZkKTsJCQ0KKwkJCXBvcnRMYWJlbC5zZXRGb250KGYpOw0KKwkJCXRoaXMuYWRkKHBvcnRMYWJlbCk7DQorCQl9DQorCQlwb3J0TGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsNCisJCXBvcnRMYWJlbC5zZXRFbmFibGVkKHRydWUpOw0KKwkJcG9ydExhYmVsLnNldFRleHQodGV4dCk7DQorCX0NCisJDQorCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsNCisJCXJldHVybiBwb3J0TGFiZWw7DQorCX0NCisNCisJcHVibGljIHZvaWQgdXBkYXRlRmlndXJlKCkgew0KKwkJaWYgKHBvcnQgIT0gbnVsbCkgew0KKwkJCVN0cmluZyBuYW1lID0gcG9ydC5nZXROYW1lKCk7DQorCQkJQ2xhc3MgdHlwZSA9IHBvcnQuZ2V0VHlwZSgpOw0KKwkJCVN0cmluZyB0eXBlTmFtZSA9ICIiOw0KKwkJCWlmKG5hbWUgPT0gbnVsbCkgew0KKwkJCQluYW1lID0gIiI7DQorCQkJfQ0KKwkJCWlmICh0eXBlICE9IG51bGwpIHsNCisJCQkJdHlwZU5hbWUgPSB0eXBlLmdldFNpbXBsZU5hbWUoKTsNCisJCQl9DQorCQkJc2V0TGFiZWwobmFtZSArICI6IiArIHR5cGVOYW1lKTsNCisJCX0NCisJfQkNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ZpZ3VyZXMvT3V0cHV0UG9ydEZpZ3VyZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ZpZ3VyZXMvT3V0cHV0UG9ydEZpZ3VyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTRhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZmlndXJlcy9PdXRwdXRQb3J0RmlndXJlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBjb21yZWwuZmlndXJlczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsNCisNCitpbXBvcnQgY29tcmVsLk91dHB1dFBvcnQ7DQorDQorcHVibGljIGFic3RyYWN0IGNsYXNzIE91dHB1dFBvcnRGaWd1cmUgZXh0ZW5kcyBFbGxpcHNlew0KKwlwcml2YXRlIE91dHB1dFBvcnQgcG9ydDsNCisJcHJpdmF0ZSBMYWJlbCBwb3J0TGFiZWw7DQorDQorCXB1YmxpYyBPdXRwdXRQb3J0IGdldFBvcnQoKSB7DQorCQlyZXR1cm4gcG9ydDsNCisJfQ0KKw0KKwkNCisJcHVibGljIHZvaWQgc2V0UG9ydChPdXRwdXRQb3J0IHBvcnQpIHsNCisJCXRoaXMucG9ydCA9IHBvcnQ7DQorCQl0aGlzLnBvcnQuc2V0RmlndXJlKHRoaXMpOw0KKwkJdXBkYXRlRmlndXJlKCk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyB0ZXh0KXsNCisJCWlmKHBvcnRMYWJlbCA9PSBudWxsKSB7DQorCQkJcG9ydExhYmVsID0gbmV3IExhYmVsKCk7DQorCQkJcG9ydExhYmVsLnNldFNpemUodGhpcy5nZXRNaW5pbXVtU2l6ZSgpKTsNCisJCQl0aGlzLnJlbW92ZUFsbCgpOw0KKwkJCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKCk7DQorCQkJZmQuc2V0SGVpZ2h0KDUpOw0KKwkJCWZkLnNldFN0eWxlKFNXVC5OT1JNQUwpOw0KKwkJCUZvbnQgZiA9IG5ldyBGb250KG51bGwsIGZkKTsNCisJCQ0KKwkJCXBvcnRMYWJlbC5zZXRGb250KGYpOw0KKwkJCXRoaXMuYWRkKHBvcnRMYWJlbCk7DQorCQl9DQorCQlwb3J0TGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsNCisJCXBvcnRMYWJlbC5zZXRFbmFibGVkKHRydWUpOw0KKwkJcG9ydExhYmVsLnNldFRleHQodGV4dCk7DQorCX0NCisJDQorCXB1YmxpYyBMYWJlbCBnZXRMYWJlbCgpIHsNCisJCXJldHVybiBwb3J0TGFiZWw7DQorCX0NCisNCisNCisJcHVibGljIHZvaWQgdXBkYXRlRmlndXJlKCkgew0KKwkJaWYgKHBvcnQgIT0gbnVsbCkgew0KKwkJCVN0cmluZyBuYW1lID0gcG9ydC5nZXROYW1lKCk7DQorCQkJQ2xhc3MgdHlwZSA9IHBvcnQuZ2V0VHlwZSgpOw0KKwkJCVN0cmluZyB0eXBlTmFtZSA9ICIiOw0KKwkJCWlmKG5hbWUgPT0gbnVsbCkgew0KKwkJCQluYW1lID0gIiI7DQorCQkJfQ0KKwkJCWlmICh0eXBlICE9IG51bGwpIHsNCisJCQkJdHlwZU5hbWUgPSB0eXBlLmdldFNpbXBsZU5hbWUoKTsNCisJCQl9DQorCQkJc2V0TGFiZWwobmFtZSArICI6IiArIHR5cGVOYW1lKTsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvZmlndXJlcy9Qb3J0TWFwcGluZ0ZpZ3VyZS5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ZpZ3VyZXMvUG9ydE1hcHBpbmdGaWd1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmYyZGFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ZpZ3VyZXMvUG9ydE1hcHBpbmdGaWd1cmUuamF2YQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGNvbXJlbC5maWd1cmVzOw0KKw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Qb2x5bGluZUNvbm5lY3Rpb25FeDsNCisNCitpbXBvcnQgY29tcmVsLlBvcnRNYXBwaW5nOw0KKw0KK3B1YmxpYyBjbGFzcyBQb3J0TWFwcGluZ0ZpZ3VyZSBleHRlbmRzIFBvbHlsaW5lQ29ubmVjdGlvbkV4IHsNCisNCisJUG9ydE1hcHBpbmcgbWFwcGluZzsNCisNCisJcHVibGljIFBvcnRNYXBwaW5nIGdldE1hcHBpbmcoKSB7DQorCQlyZXR1cm4gbWFwcGluZzsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBzZXRNYXBwaW5nKFBvcnRNYXBwaW5nIG1hcHBpbmcpIHsNCisJCXRoaXMubWFwcGluZyA9IG1hcHBpbmc7DQorCQltYXBwaW5nLnNldEZpZ3VyZSh0aGlzKTsNCisJfQkNCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQXRvbWljVW5pdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0F0b21pY1VuaXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2ZjY4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0F0b21pY1VuaXRJbXBsLmphdmEKQEAgLTAsMCArMSw1ODAgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLklucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLk1vZGVsUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC51dGlsLkNvbXJlbFV0aWw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXRvbWljIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQXRvbWljVW5pdEltcGwjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbCNnZXRVbml0SWQgPGVtPlVuaXQgSWQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbCNnZXRMYWJlbCA8ZW0+TGFiZWw8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbCNnZXROYW1lc3BhY2VVcmkgPGVtPk5hbWVzcGFjZSBVcmk8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQXRvbWljVW5pdEltcGwjZ2V0TW9kZWxSZWZhY3RvcmluZyA8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbCNpc0NoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcgPGVtPkNoZWNrIEluaXRpYWwgQ29uZGl0aW9uIEZsYWc8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5BdG9taWNVbml0SW1wbCNpc0NoZWNrRmluYWxDb25kaXRpb25GbGFnIDxlbT5DaGVjayBGaW5hbCBDb25kaXRpb24gRmxhZzwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEF0b21pY1VuaXRJbXBsIGV4dGVuZHMgUmVmYWN0b3JpbmdVbml0SW1wbCBpbXBsZW1lbnRzIEF0b21pY1VuaXQgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5wdXRQb3J0cygpIDxlbT5JbnB1dCBQb3J0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRJbnB1dFBvcnRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PFNpbmdsZUlucHV0UG9ydD4gaW5wdXRQb3J0czsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0SWQoKSA8ZW0+VW5pdCBJZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VW5pdElkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JVF9JRF9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0SWQoKSA8ZW0+VW5pdCBJZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VW5pdElkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyB1bml0SWQgPSBVTklUX0lEX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsKCkgPGVtPkxhYmVsPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsKCkgPGVtPkxhYmVsPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBMQUJFTF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVcmkoKSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TmFtZXNwYWNlVXJpKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVcmkoKSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TmFtZXNwYWNlVXJpKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVcmkgPSBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSAiQXRvbWljIFVuaXQiOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUeXBlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZGVsUmVmYWN0b3JpbmcoKSA8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE1vZGVsUmVmYWN0b3JpbmcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTW9kZWxSZWZhY3RvcmluZyBtb2RlbFJlZmFjdG9yaW5nOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZygpIDxlbT5DaGVjayBJbml0aWFsIENvbmRpdGlvbiBGbGFnPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNpc0NoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0hFQ0tfSU5JVElBTF9DT05ESVRJT05fRkxBR19FREVGQVVMVCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDaGVja0luaXRpYWxDb25kaXRpb25GbGFnKCkgPGVtPkNoZWNrIEluaXRpYWwgQ29uZGl0aW9uIEZsYWc8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2lzQ2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBib29sZWFuIGNoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcgPSBDSEVDS19JTklUSUFMX0NPTkRJVElPTl9GTEFHX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKSA8ZW0+Q2hlY2sgRmluYWwgQ29uZGl0aW9uIEZsYWc8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2lzQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0hFQ0tfRklOQUxfQ09ORElUSU9OX0ZMQUdfRURFRkFVTFQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKSA8ZW0+Q2hlY2sgRmluYWwgQ29uZGl0aW9uIEZsYWc8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2lzQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0ZpbmFsQ29uZGl0aW9uRmxhZyA9IENIRUNLX0ZJTkFMX0NPTkRJVElPTl9GTEFHX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBBdG9taWNVbml0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJcHVibGljIEF0b21pY1VuaXRJbXBsKE1vZGVsUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcpIHsNCisJCXN1cGVyKCk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIktvbnN0cnVrdG9yOiBBdG9taWNVbml0SW1wbChNb2RlbFJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nKSIpOw0KKwkJQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorDQorCQl0aGlzLm1vZGVsUmVmYWN0b3JpbmcgPSByZWZhY3RvcmluZzsNCisJCVN5c3RlbS5vdXQucHJpbnRsbigibW9kZWxSZWZhY3RvcmluZzogIiArIG1vZGVsUmVmYWN0b3JpbmcpOw0KKwkJdGhpcy51bml0SWQgPSBuZXcgU3RyaW5nKHJlZmFjdG9yaW5nLmdldFJlZklkKCkpOw0KKwkJdGhpcy5uYW1lID0gbmV3IFN0cmluZyhyZWZhY3RvcmluZy5nZXROYW1lKCkpOw0KKwkJdGhpcy5sYWJlbCA9IG5ldyBTdHJpbmcocmVmYWN0b3JpbmcuZ2V0TmFtZSgpKTsNCisJCXRoaXMubmFtZXNwYWNlVXJpID0gcmVmYWN0b3JpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7DQorCQlTaW5nbGVJbnB1dFBvcnQgdGVtcFBvcnQ7DQorDQorCQlmb3IoU2luZ2xlSW5wdXRQb3J0IGluUG9ydCA6IHJlZmFjdG9yaW5nLmdldElucHV0UG9ydHMoKSl7DQorCQkJdGVtcFBvcnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKwkJCXRlbXBQb3J0LnNldERlc2NyaXB0aW9uKGluUG9ydC5nZXREZXNjcmlwdGlvbigpKTsNCisJCQl0ZW1wUG9ydC5zZXROYW1lKGluUG9ydC5nZXROYW1lKCkpOw0KKwkJCXRlbXBQb3J0LnNldFR5cGUoaW5Qb3J0LmdldFR5cGUoKSk7DQorDQorCQkJdGhpcy5nZXRJbnB1dFBvcnRzKCkuYWRkKHRlbXBQb3J0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkFUT01JQ19VTklUOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PFNpbmdsZUlucHV0UG9ydD4gZ2V0SW5wdXRQb3J0cygpIHsNCisJCWlmIChpbnB1dFBvcnRzID09IG51bGwpIHsNCisJCQlpbnB1dFBvcnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNpbmdsZUlucHV0UG9ydD4oU2luZ2xlSW5wdXRQb3J0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19JTlBVVF9QT1JUUyk7DQorCQl9DQorCQlyZXR1cm4gaW5wdXRQb3J0czsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdElkKCkgew0KKwkJcmV0dXJuIHVuaXRJZDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFVuaXRJZChTdHJpbmcgbmV3VW5pdElkKSB7DQorCQlpZiAoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpKSB7DQorCQkJU3RyaW5nIG9sZFVuaXRJZCA9IHVuaXRJZDsNCisJCQl1bml0SWQgPSBuZXdVbml0SWQ7DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19VTklUX0lELCBvbGRVbml0SWQsIHVuaXRJZCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCisJCXJldHVybiBsYWJlbDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBuZXdMYWJlbCkgew0KKwkJaWYgKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSkgew0KKwkJCVN0cmluZyBvbGRMYWJlbCA9IGxhYmVsOw0KKwkJCWxhYmVsID0gbmV3TGFiZWw7DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19MQUJFTCwgb2xkTGFiZWwsIGxhYmVsKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpIHsNCisJCXJldHVybiBuYW1lc3BhY2VVcmk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVcmkoU3RyaW5nIG5ld05hbWVzcGFjZVVyaSkgew0KKwkJaWYgKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSkgew0KKwkJCVN0cmluZyBvbGROYW1lc3BhY2VVcmkgPSBuYW1lc3BhY2VVcmk7DQorCQkJbmFtZXNwYWNlVXJpID0gbmV3TmFtZXNwYWNlVXJpOw0KKwkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVXJpLCBuYW1lc3BhY2VVcmkpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCisJCXJldHVybiB0eXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE1vZGVsUmVmYWN0b3JpbmcgZ2V0TW9kZWxSZWZhY3RvcmluZygpIHsNCisJCWlmIChtb2RlbFJlZmFjdG9yaW5nICE9IG51bGwgJiYgbW9kZWxSZWZhY3RvcmluZy5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE1vZGVsUmVmYWN0b3JpbmcgPSAoSW50ZXJuYWxFT2JqZWN0KW1vZGVsUmVmYWN0b3Jpbmc7DQorCQkJbW9kZWxSZWZhY3RvcmluZyA9IChNb2RlbFJlZmFjdG9yaW5nKWVSZXNvbHZlUHJveHkob2xkTW9kZWxSZWZhY3RvcmluZyk7DQorCQkJaWYgKG1vZGVsUmVmYWN0b3JpbmcgIT0gb2xkTW9kZWxSZWZhY3RvcmluZykgew0KKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fTU9ERUxfUkVGQUNUT1JJTkcsIG9sZE1vZGVsUmVmYWN0b3JpbmcsIG1vZGVsUmVmYWN0b3JpbmcpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gbW9kZWxSZWZhY3RvcmluZzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNb2RlbFJlZmFjdG9yaW5nIGJhc2ljR2V0TW9kZWxSZWZhY3RvcmluZygpIHsNCisJCXJldHVybiBtb2RlbFJlZmFjdG9yaW5nOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TW9kZWxSZWZhY3RvcmluZyhNb2RlbFJlZmFjdG9yaW5nIG5ld01vZGVsUmVmYWN0b3JpbmcpIHsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBBdG9taWNVbml0OjpzZXRNb2RlbFJlZmFjdG9yaW5nKE1vZGVsUmVmYWN0b3JpbmcgbmV3TW9kZWxSZWZhY3RvcmluZykiKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJ2b3JoZXI6ICIgKyB0aGlzLmdldE1vZGVsUmVmYWN0b3JpbmcoKSk7DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigienUgc2V0emVuOiAiICsgbmV3TW9kZWxSZWZhY3RvcmluZyk7DQorCQlpZiAoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpIHx8IG1vZGVsUmVmYWN0b3JpbmcgPT0gbnVsbCl7DQorCQkJTW9kZWxSZWZhY3RvcmluZyBvbGRNb2RlbFJlZmFjdG9yaW5nID0gbW9kZWxSZWZhY3RvcmluZzsNCisJCQltb2RlbFJlZmFjdG9yaW5nID0gbmV3TW9kZWxSZWZhY3RvcmluZzsNCisJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX01PREVMX1JFRkFDVE9SSU5HLCBvbGRNb2RlbFJlZmFjdG9yaW5nLCBtb2RlbFJlZmFjdG9yaW5nKSk7DQorCQl9DQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigibmFjaGhlcjogIiArIHRoaXMuZ2V0TW9kZWxSZWZhY3RvcmluZygpKTsNCisvLwkJU3lzdGVtLm91dC5wcmludGxuKCJlbmRlIEF0b21pY1VuaXQ6OnNldE1vZGVsUmVmYWN0b3JpbmcoTW9kZWxSZWZhY3RvcmluZyBuZXdNb2RlbFJlZmFjdG9yaW5nKSIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaXNDaGVja0luaXRpYWxDb25kaXRpb25GbGFnKCkgew0KKwkJcmV0dXJuIGNoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDaGVja0luaXRpYWxDb25kaXRpb25GbGFnKGJvb2xlYW4gbmV3Q2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZykgew0KKwkJYm9vbGVhbiBvbGRDaGVja0luaXRpYWxDb25kaXRpb25GbGFnID0gY2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZzsNCisJCWNoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcgPSBuZXdDaGVja0luaXRpYWxDb25kaXRpb25GbGFnOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0NIRUNLX0lOSVRJQUxfQ09ORElUSU9OX0ZMQUcsIG9sZENoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcsIGNoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKSB7DQorCQlyZXR1cm4gY2hlY2tGaW5hbENvbmRpdGlvbkZsYWc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZyhib29sZWFuIG5ld0NoZWNrRmluYWxDb25kaXRpb25GbGFnKSB7DQorCQlib29sZWFuIG9sZENoZWNrRmluYWxDb25kaXRpb25GbGFnID0gY2hlY2tGaW5hbENvbmRpdGlvbkZsYWc7DQorCQljaGVja0ZpbmFsQ29uZGl0aW9uRmxhZyA9IG5ld0NoZWNrRmluYWxDb25kaXRpb25GbGFnOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0NIRUNLX0ZJTkFMX0NPTkRJVElPTl9GTEFHLCBvbGRDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZywgY2hlY2tGaW5hbENvbmRpdGlvbkZsYWcpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5wdXRQb3J0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gZ2V0SW5wdXRQb3J0cygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fVU5JVF9JRDoNCisJCQkJcmV0dXJuIGdldFVuaXRJZCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fTEFCRUw6DQorCQkJCXJldHVybiBnZXRMYWJlbCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fTkFNRVNQQUNFX1VSSToNCisJCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVyaSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fVFlQRToNCisJCQkJcmV0dXJuIGdldFR5cGUoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX01PREVMX1JFRkFDVE9SSU5HOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZGVsUmVmYWN0b3JpbmcoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0TW9kZWxSZWZhY3RvcmluZygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fQ0hFQ0tfSU5JVElBTF9DT05ESVRJT05fRkxBRzoNCisJCQkJcmV0dXJuIGlzQ2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fQ0hFQ0tfRklOQUxfQ09ORElUSU9OX0ZMQUc6DQorCQkJCXJldHVybiBpc0NoZWNrRmluYWxDb25kaXRpb25GbGFnKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19JTlBVVF9QT1JUUzoNCisJCQkJZ2V0SW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCWdldElucHV0UG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNpbmdsZUlucHV0UG9ydD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19VTklUX0lEOg0KKwkJCQlzZXRVbml0SWQoKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0xBQkVMOg0KKwkJCQlzZXRMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fTkFNRVNQQUNFX1VSSToNCisJCQkJc2V0TmFtZXNwYWNlVXJpKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19NT0RFTF9SRUZBQ1RPUklORzoNCisJCQkJc2V0TW9kZWxSZWZhY3RvcmluZygoTW9kZWxSZWZhY3RvcmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0NIRUNLX0lOSVRJQUxfQ09ORElUSU9OX0ZMQUc6DQorCQkJCXNldENoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcoKEJvb2xlYW4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19DSEVDS19GSU5BTF9DT05ESVRJT05fRkxBRzoNCisJCQkJc2V0Q2hlY2tGaW5hbENvbmRpdGlvbkZsYWcoKEJvb2xlYW4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fSU5QVVRfUE9SVFM6DQorCQkJCWdldElucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19VTklUX0lEOg0KKwkJCQlzZXRVbml0SWQoVU5JVF9JRF9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0xBQkVMOg0KKwkJCQlzZXRMYWJlbChMQUJFTF9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX05BTUVTUEFDRV9VUkk6DQorCQkJCXNldE5hbWVzcGFjZVVyaShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fTU9ERUxfUkVGQUNUT1JJTkc6DQorCQkJCXNldE1vZGVsUmVmYWN0b3JpbmcoKE1vZGVsUmVmYWN0b3JpbmcpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0NIRUNLX0lOSVRJQUxfQ09ORElUSU9OX0ZMQUc6DQorCQkJCXNldENoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcoQ0hFQ0tfSU5JVElBTF9DT05ESVRJT05fRkxBR19FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0NIRUNLX0ZJTkFMX0NPTkRJVElPTl9GTEFHOg0KKwkJCQlzZXRDaGVja0ZpbmFsQ29uZGl0aW9uRmxhZyhDSEVDS19GSU5BTF9DT05ESVRJT05fRkxBR19FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiBpbnB1dFBvcnRzICE9IG51bGwgJiYgIWlucHV0UG9ydHMuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVF9fVU5JVF9JRDoNCisJCQkJcmV0dXJuIFVOSVRfSURfRURFRkFVTFQgPT0gbnVsbCA/IHVuaXRJZCAhPSBudWxsIDogIVVOSVRfSURfRURFRkFVTFQuZXF1YWxzKHVuaXRJZCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19MQUJFTDoNCisJCQkJcmV0dXJuIExBQkVMX0VERUZBVUxUID09IG51bGwgPyBsYWJlbCAhPSBudWxsIDogIUxBQkVMX0VERUZBVUxULmVxdWFscyhsYWJlbCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19OQU1FU1BBQ0VfVVJJOg0KKwkJCQlyZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVXJpICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVXJpKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX1RZUEU6DQorCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19NT0RFTF9SRUZBQ1RPUklORzoNCisJCQkJcmV0dXJuIG1vZGVsUmVmYWN0b3JpbmcgIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQVRPTUlDX1VOSVRfX0NIRUNLX0lOSVRJQUxfQ09ORElUSU9OX0ZMQUc6DQorCQkJCXJldHVybiBjaGVja0luaXRpYWxDb25kaXRpb25GbGFnICE9IENIRUNLX0lOSVRJQUxfQ09ORElUSU9OX0ZMQUdfRURFRkFVTFQ7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUX19DSEVDS19GSU5BTF9DT05ESVRJT05fRkxBRzoNCisJCQkJcmV0dXJuIGNoZWNrRmluYWxDb25kaXRpb25GbGFnICE9IENIRUNLX0ZJTkFMX0NPTkRJVElPTl9GTEFHX0VERUZBVUxUOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAodW5pdElkOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodW5pdElkKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgbGFiZWw6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChsYWJlbCk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVyaTogIik7DQorCQlyZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVyaSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZCh0eXBlKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgY2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZzogIik7DQorCQlyZXN1bHQuYXBwZW5kKGNoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBjaGVja0ZpbmFsQ29uZGl0aW9uRmxhZzogIik7DQorCQlyZXN1bHQuYXBwZW5kKGNoZWNrRmluYWxDb25kaXRpb25GbGFnKTsNCisJCXJlc3VsdC5hcHBlbmQoJyknKTsNCisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCisJfQ0KKwkNCisJcHVibGljIEVMaXN0PElucHV0UG9ydD4gZ2V0QWxsSW5wdXRQb3J0cygpIHsNCisJCUVMaXN0PElucHV0UG9ydD4gcmVzdWx0ID0gbmV3IEJhc2ljRUxpc3Q8SW5wdXRQb3J0PigpOw0KKwkJcmVzdWx0LmFkZEFsbCh0aGlzLmdldElucHV0UG9ydHMoKSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorfSAvL0F0b21pY1VuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ2FydGVzaWFuUXVldWVkVW5pdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0NhcnRlc2lhblF1ZXVlZFVuaXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4NTU2MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0NhcnRlc2lhblF1ZXVlZFVuaXRJbXBsLmphdmEKQEAgLTAsMCArMSw0MjMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCisNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkhlbHBlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXJ0ZXNpYW4gUXVldWVkIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQ2FydGVzaWFuUXVldWVkVW5pdEltcGwjZ2V0SGVscGVyVW5pdHMgPGVtPkhlbHBlciBVbml0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNhcnRlc2lhblF1ZXVlZFVuaXRJbXBsI2dldFJlZmFjdG9yaW5nVW5pdCA8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNhcnRlc2lhblF1ZXVlZFVuaXRJbXBsI2dldFNpbmdsZUlucHV0UG9ydHMgPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNhcnRlc2lhblF1ZXVlZFVuaXRJbXBsI2dldE11bHRpSW5wdXRQb3J0cyA8ZW0+TXVsdGkgSW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQ2FydGVzaWFuUXVldWVkVW5pdEltcGwjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2FydGVzaWFuUXVldWVkVW5pdEltcGwgZXh0ZW5kcyBUd2ljZWRRdWV1ZWRVbml0SW1wbCBpbXBsZW1lbnRzIENhcnRlc2lhblF1ZXVlZFVuaXQgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVscGVyVW5pdHMoKSA8ZW0+SGVscGVyIFVuaXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEhlbHBlclVuaXRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PEhlbHBlclVuaXQ+IGhlbHBlclVuaXRzOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmYWN0b3JpbmdVbml0KCkgPGVtPlJlZmFjdG9yaW5nIFVuaXQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFJlZmFjdG9yaW5nVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBSZWZhY3RvcmluZ1VuaXQgcmVmYWN0b3JpbmdVbml0Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2luZ2xlSW5wdXRQb3J0cygpIDxlbT5TaW5nbGUgSW5wdXQgUG9ydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0U2luZ2xlSW5wdXRQb3J0cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFTGlzdDxTaW5nbGVJbnB1dFBvcnQ+IHNpbmdsZUlucHV0UG9ydHM7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdWx0aUlucHV0UG9ydHMoKSA8ZW0+TXVsdGkgSW5wdXQgUG9ydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TXVsdGlJbnB1dFBvcnRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PE11bHRpSW5wdXRQb3J0PiBtdWx0aUlucHV0UG9ydHM7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUeXBlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9ICJDYXJ0ZXNpYW4gUXVldWVkIFVuaXQiOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUeXBlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYmxTdHJpY3QoKSA8ZW0+TGJsIFN0cmljdDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TGJsU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEJMX1NUUklDVF9FREVGQVVMVCA9ICJzdHJpY3QiOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGJsU3RyaWN0KCkgPGVtPkxibCBTdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldExibFN0cmljdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgbGJsU3RyaWN0ID0gTEJMX1NUUklDVF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ2FydGVzaWFuUXVldWVkVW5pdEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ0FSVEVTSUFOX1FVRVVFRF9VTklUOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PEhlbHBlclVuaXQ+IGdldEhlbHBlclVuaXRzKCkgew0KKwkJaWYgKGhlbHBlclVuaXRzID09IG51bGwpIHsNCisJCQloZWxwZXJVbml0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxIZWxwZXJVbml0PihIZWxwZXJVbml0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCX0NCisJCXJldHVybiBoZWxwZXJVbml0czsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSZWZhY3RvcmluZ1VuaXQgZ2V0UmVmYWN0b3JpbmdVbml0KCkgew0KKwkJcmV0dXJuIHJlZmFjdG9yaW5nVW5pdDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlZmFjdG9yaW5nVW5pdChSZWZhY3RvcmluZ1VuaXQgbmV3UmVmYWN0b3JpbmdVbml0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlSZWZhY3RvcmluZ1VuaXQgb2xkUmVmYWN0b3JpbmdVbml0ID0gcmVmYWN0b3JpbmdVbml0Ow0KKwkJcmVmYWN0b3JpbmdVbml0ID0gbmV3UmVmYWN0b3JpbmdVbml0Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7DQorCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULCBvbGRSZWZhY3RvcmluZ1VuaXQsIG5ld1JlZmFjdG9yaW5nVW5pdCk7DQorCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOw0KKwkJfQ0KKwkJcmV0dXJuIG1zZ3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRSZWZhY3RvcmluZ1VuaXQoUmVmYWN0b3JpbmdVbml0IG5ld1JlZmFjdG9yaW5nVW5pdCkgew0KKwkJaWYgKG5ld1JlZmFjdG9yaW5nVW5pdCAhPSByZWZhY3RvcmluZ1VuaXQpIHsNCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCisJCQlpZiAocmVmYWN0b3JpbmdVbml0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWZhY3RvcmluZ1VuaXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld1JlZmFjdG9yaW5nVW5pdCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVmYWN0b3JpbmdVbml0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldFJlZmFjdG9yaW5nVW5pdChuZXdSZWZhY3RvcmluZ1VuaXQsIG1zZ3MpOw0KKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsNCisJCX0NCisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULCBuZXdSZWZhY3RvcmluZ1VuaXQsIG5ld1JlZmFjdG9yaW5nVW5pdCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PFNpbmdsZUlucHV0UG9ydD4gZ2V0U2luZ2xlSW5wdXRQb3J0cygpIHsNCisJCWlmIChzaW5nbGVJbnB1dFBvcnRzID09IG51bGwpIHsNCisJCQlzaW5nbGVJbnB1dFBvcnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNpbmdsZUlucHV0UG9ydD4oU2luZ2xlSW5wdXRQb3J0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTKTsNCisJCX0NCisJCXJldHVybiBzaW5nbGVJbnB1dFBvcnRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PE11bHRpSW5wdXRQb3J0PiBnZXRNdWx0aUlucHV0UG9ydHMoKSB7DQorCQlpZiAobXVsdGlJbnB1dFBvcnRzID09IG51bGwpIHsNCisJCQltdWx0aUlucHV0UG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TXVsdGlJbnB1dFBvcnQ+KE11bHRpSW5wdXRQb3J0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIG11bHRpSW5wdXRQb3J0czsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCisJCXJldHVybiB0eXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRMYmxTdHJpY3QoKSB7DQorCQlyZXR1cm4gbGJsU3RyaWN0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGJsU3RyaWN0KFN0cmluZyBuZXdMYmxTdHJpY3QpIHsNCisJCVN0cmluZyBvbGRMYmxTdHJpY3QgPSBsYmxTdHJpY3Q7DQorCQlsYmxTdHJpY3QgPSBuZXdMYmxTdHJpY3Q7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QsIG9sZExibFN0cmljdCwgbGJsU3RyaWN0KSk7DQorCX0NCisJDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBzZXRTdHJpY3QoYm9vbGVhbiBuZXdTdHJpY3QpIHsNCisJCXN1cGVyLnNldFN0cmljdChuZXdTdHJpY3QpOw0KKwkJaWYgKG5ld1N0cmljdCkgc2V0TGJsU3RyaWN0KCJzdHJpY3QiKTsNCisJCWVsc2Ugc2V0TGJsU3RyaWN0KCJub24gc3RyaWN0Iik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGVscGVyVW5pdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJCXJldHVybiBiYXNpY1NldFJlZmFjdG9yaW5nVW5pdChudWxsLCBtc2dzKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2luZ2xlSW5wdXRQb3J0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TXVsdGlJbnB1dFBvcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJcmV0dXJuIGdldEhlbHBlclVuaXRzKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVDoNCisJCQkJcmV0dXJuIGdldFJlZmFjdG9yaW5nVW5pdCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIGdldFNpbmdsZUlucHV0UG9ydHMoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0cygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1RZUEU6DQorCQkJCXJldHVybiBnZXRUeXBlKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJcmV0dXJuIGdldExibFN0cmljdCgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJZ2V0SGVscGVyVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlnZXRIZWxwZXJVbml0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSGVscGVyVW5pdD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVDoNCisJCQkJc2V0UmVmYWN0b3JpbmdVbml0KChSZWZhY3RvcmluZ1VuaXQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTOg0KKwkJCQlnZXRTaW5nbGVJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJZ2V0U2luZ2xlSW5wdXRQb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2luZ2xlSW5wdXRQb3J0PiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUzoNCisJCQkJZ2V0TXVsdGlJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJZ2V0TXVsdGlJbnB1dFBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNdWx0aUlucHV0UG9ydD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJc2V0TGJsU3RyaWN0KChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJZ2V0SGVscGVyVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVDoNCisJCQkJc2V0UmVmYWN0b3JpbmdVbml0KChSZWZhY3RvcmluZ1VuaXQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCWdldFNpbmdsZUlucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVFM6DQorCQkJCWdldE11bHRpSW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19MQkxfU1RSSUNUOg0KKwkJCQlzZXRMYmxTdHJpY3QoTEJMX1NUUklDVF9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJcmV0dXJuIGhlbHBlclVuaXRzICE9IG51bGwgJiYgIWhlbHBlclVuaXRzLmlzRW1wdHkoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUOg0KKwkJCQlyZXR1cm4gcmVmYWN0b3JpbmdVbml0ICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0cyAhPSBudWxsICYmICFzaW5nbGVJbnB1dFBvcnRzLmlzRW1wdHkoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIG11bHRpSW5wdXRQb3J0cyAhPSBudWxsICYmICFtdWx0aUlucHV0UG9ydHMuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVRfX1RZUEU6DQorCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNBUlRFU0lBTl9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJcmV0dXJuIExCTF9TVFJJQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGxibFN0cmljdCAhPSBudWxsIDogIUxCTF9TVFJJQ1RfRURFRkFVTFQuZXF1YWxzKGxibFN0cmljdCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodHlwZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGxibFN0cmljdDogIik7DQorCQlyZXN1bHQuYXBwZW5kKGxibFN0cmljdCk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIGluaXQoKXsNCisJCUNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwkJTXVsdGlJbnB1dFBvcnQgb25lID0gZmFjdG9yeS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKwkJTXVsdGlJbnB1dFBvcnQgdHdvID0gZmFjdG9yeS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKwkJdGhpcy5nZXRNdWx0aUlucHV0UG9ydHMoKS5hZGQob25lKTsNCisJCXRoaXMuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuYWRkKHR3byk7DQorCX0NCisJDQorCXB1YmxpYyBFTGlzdDxJbnB1dFBvcnQ+IGdldEFsbElucHV0UG9ydHMoKSB7DQorCQlFTGlzdDxJbnB1dFBvcnQ+IGlucHV0UG9ydHMgPSBuZXcgQmFzaWNFTGlzdDxJbnB1dFBvcnQ+KCk7DQorCQlpbnB1dFBvcnRzLmFkZEFsbCh0aGlzLmdldFNpbmdsZUlucHV0UG9ydHMoKSk7DQorCQlpbnB1dFBvcnRzLmFkZEFsbCh0aGlzLmdldE11bHRpSW5wdXRQb3J0cygpKTsNCisJCXJldHVybiBpbnB1dFBvcnRzOw0KKwl9DQorDQorfSAvL0NhcnRlc2lhblF1ZXVlZFVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Db21wb3NpdGVSZWZhY3RvcmluZ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzE3OGM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsLmphdmEKQEAgLTAsMCArMSw4MjkgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCisNCitpbXBvcnQgY29tcmVsLkF0b21pY1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5DYXJ0ZXNpYW5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcG9zaXRlUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkhlbHBlcjsNCitpbXBvcnQgY29tcmVsLkhlbHBlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5NYXBwaW5nVmlzdWFsaXphdGlvbjsNCitpbXBvcnQgY29tcmVsLk1vZGVsUmVmYWN0b3Jpbmc7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlcjsNCitpbXBvcnQgY29tcmVsLlBhcmFsbGVsUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLlBvcnRNYXBwaW5nOw0KK2ltcG9ydCBjb21yZWwuUmVmYWN0b3JpbmdVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2VxdWVudGlhbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmlsdGVySGVscGVyOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUXVldWVkVW5pdDsNCitpbXBvcnQgY29tcmVsLnV0aWwuUmVnaXN0cnlVdGlsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbXBvc2l0ZSBSZWZhY3RvcmluZzwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Db21wb3NpdGVSZWZhY3RvcmluZ0ltcGwjZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCA8ZW0+TWFpbiBSZWZhY3RvcmluZyBVbml0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsI2dldFBvcnRNYXBwaW5ncyA8ZW0+UG9ydCBNYXBwaW5nczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nSW1wbCNnZXRNb2RlbFJlZmFjdG9yaW5ncyA8ZW0+TW9kZWwgUmVmYWN0b3JpbmdzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsI2dldEhlbHBlciA8ZW0+SGVscGVyPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsI2dldE1hcHBpbmdWaXN1YWxpemF0aW9uIDxlbT5NYXBwaW5nIFZpc3VhbGl6YXRpb248L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Db21wb3NpdGVSZWZhY3RvcmluZ0ltcGwjZ2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbiA8ZW0+Q3VzdG9tIEluaXRpYWwgQ29uZGl0aW9uPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsI2dldEN1c3RvbUZpbmFsQ29uZGl0aW9uIDxlbT5DdXN0b20gRmluYWwgQ29uZGl0aW9uPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsIGV4dGVuZHMgTW9kZWxSZWZhY3RvcmluZ0ltcGwgaW1wbGVtZW50cyBDb21wb3NpdGVSZWZhY3RvcmluZyB7DQorCQ0KKwlwdWJsaWMgU2V0PEludGVnZXI+IG1hcHBpbmdOdW1iZXJzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsNCisNCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbnNVcmkgPSAiIjsNCisJDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluUmVmYWN0b3JpbmdVbml0KCkgPGVtPk1haW4gUmVmYWN0b3JpbmcgVW5pdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBSZWZhY3RvcmluZ1VuaXQgbWFpblJlZmFjdG9yaW5nVW5pdDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRNYXBwaW5ncygpIDxlbT5Qb3J0IE1hcHBpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFBvcnRNYXBwaW5ncygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFTGlzdDxQb3J0TWFwcGluZz4gcG9ydE1hcHBpbmdzOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kZWxSZWZhY3RvcmluZ3MoKSA8ZW0+TW9kZWwgUmVmYWN0b3JpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE1vZGVsUmVmYWN0b3JpbmdzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PE1vZGVsUmVmYWN0b3Jpbmc+IG1vZGVsUmVmYWN0b3JpbmdzOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVscGVyKCkgPGVtPkhlbHBlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8SGVscGVyPiBoZWxwZXI7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGluZ1Zpc3VhbGl6YXRpb24oKSA8ZW0+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRNYXBwaW5nVmlzdWFsaXphdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwcGluZ1Zpc3VhbGl6YXRpb24gTUFQUElOR19WSVNVQUxJWkFUSU9OX0VERUZBVUxUID0gTWFwcGluZ1Zpc3VhbGl6YXRpb24uQVJST1dTOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGluZ1Zpc3VhbGl6YXRpb24oKSA8ZW0+TWFwcGluZyBWaXN1YWxpemF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRNYXBwaW5nVmlzdWFsaXphdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBNYXBwaW5nVmlzdWFsaXphdGlvbiBtYXBwaW5nVmlzdWFsaXphdGlvbiA9IE1BUFBJTkdfVklTVUFMSVpBVElPTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21Jbml0aWFsQ29uZGl0aW9uKCkgPGVtPkN1c3RvbSBJbml0aWFsIENvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTklUSUFMX0NPTkRJVElPTl9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21Jbml0aWFsQ29uZGl0aW9uKCkgPGVtPkN1c3RvbSBJbml0aWFsIENvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgY3VzdG9tSW5pdGlhbENvbmRpdGlvbiA9IENVU1RPTV9JTklUSUFMX0NPTkRJVElPTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21GaW5hbENvbmRpdGlvbigpIDxlbT5DdXN0b20gRmluYWwgQ29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRDdXN0b21GaW5hbENvbmRpdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9GSU5BTF9DT05ESVRJT05fRURFRkFVTFQgPSBudWxsOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9tRmluYWxDb25kaXRpb24oKSA8ZW0+Q3VzdG9tIEZpbmFsIENvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0Q3VzdG9tRmluYWxDb25kaXRpb24oKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbUZpbmFsQ29uZGl0aW9uID0gQ1VTVE9NX0ZJTkFMX0NPTkRJVElPTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9SRUZBQ1RPUklORzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSZWZhY3RvcmluZ1VuaXQgZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpIHsNCisJCXJldHVybiBtYWluUmVmYWN0b3JpbmdVbml0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFpblJlZmFjdG9yaW5nVW5pdChSZWZhY3RvcmluZ1VuaXQgbmV3TWFpblJlZmFjdG9yaW5nVW5pdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJUmVmYWN0b3JpbmdVbml0IG9sZE1haW5SZWZhY3RvcmluZ1VuaXQgPSBtYWluUmVmYWN0b3JpbmdVbml0Ow0KKwkJbWFpblJlZmFjdG9yaW5nVW5pdCA9IG5ld01haW5SZWZhY3RvcmluZ1VuaXQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BSU5fUkVGQUNUT1JJTkdfVU5JVCwgb2xkTWFpblJlZmFjdG9yaW5nVW5pdCwgbmV3TWFpblJlZmFjdG9yaW5nVW5pdCk7DQorCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOw0KKwkJfQ0KKwkJaWYgKHRoaXMuZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpICE9IG51bGwpIHsNCisJCQl0aGlzLmdldE1haW5SZWZhY3RvcmluZ1VuaXQoKS5zZXROYW1lKHRoaXMuZ2V0TmFtZSgpLCBmYWxzZSk7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE1haW5SZWZhY3RvcmluZ1VuaXQoUmVmYWN0b3JpbmdVbml0IG5ld01haW5SZWZhY3RvcmluZ1VuaXQpIHsNCisJCWlmIChuZXdNYWluUmVmYWN0b3JpbmdVbml0ICE9IG1haW5SZWZhY3RvcmluZ1VuaXQpIHsNCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCisJCQlpZiAobWFpblJlZmFjdG9yaW5nVW5pdCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFpblJlZmFjdG9yaW5nVW5pdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdNYWluUmVmYWN0b3JpbmdVbml0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYWluUmVmYWN0b3JpbmdVbml0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BSU5fUkVGQUNUT1JJTkdfVU5JVCwgbnVsbCwgbXNncyk7DQorCQkJbXNncyA9IGJhc2ljU2V0TWFpblJlZmFjdG9yaW5nVW5pdChuZXdNYWluUmVmYWN0b3JpbmdVbml0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fTUFJTl9SRUZBQ1RPUklOR19VTklULCBuZXdNYWluUmVmYWN0b3JpbmdVbml0LCBuZXdNYWluUmVmYWN0b3JpbmdVbml0KSk7DQorCQlpZiAodGhpcy5nZXRNYWluUmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCXRoaXMuZ2V0TWFpblJlZmFjdG9yaW5nVW5pdCgpLnNldE5hbWUodGhpcy5nZXROYW1lKCksIGZhbHNlKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxQb3J0TWFwcGluZz4gZ2V0UG9ydE1hcHBpbmdzKCkgew0KKwkJaWYgKHBvcnRNYXBwaW5ncyA9PSBudWxsKSB7DQorCQkJcG9ydE1hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBvcnRNYXBwaW5nPihQb3J0TWFwcGluZy5jbGFzcywgdGhpcywgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX1BPUlRfTUFQUElOR1MpOw0KKwkJfQ0KKwkJcmV0dXJuIHBvcnRNYXBwaW5nczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxNb2RlbFJlZmFjdG9yaW5nPiBnZXRNb2RlbFJlZmFjdG9yaW5ncygpIHsNCisJCWlmIChtb2RlbFJlZmFjdG9yaW5ncyA9PSBudWxsKSB7DQorCQkJbW9kZWxSZWZhY3RvcmluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TW9kZWxSZWZhY3RvcmluZz4oTW9kZWxSZWZhY3RvcmluZy5jbGFzcywgdGhpcywgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01PREVMX1JFRkFDVE9SSU5HUyk7DQorCQl9DQorCQlyZXR1cm4gbW9kZWxSZWZhY3RvcmluZ3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUxpc3Q8SGVscGVyPiBnZXRIZWxwZXIoKSB7DQorCQlpZiAoaGVscGVyID09IG51bGwpIHsNCisJCQloZWxwZXIgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SGVscGVyPihIZWxwZXIuY2xhc3MsIHRoaXMsIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19IRUxQRVIpOw0KKwkJfQ0KKwkJcmV0dXJuIGhlbHBlcjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNYXBwaW5nVmlzdWFsaXphdGlvbiBnZXRNYXBwaW5nVmlzdWFsaXphdGlvbigpIHsNCisJCXJldHVybiBtYXBwaW5nVmlzdWFsaXphdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdWaXN1YWxpemF0aW9uKE1hcHBpbmdWaXN1YWxpemF0aW9uIG5ld01hcHBpbmdWaXN1YWxpemF0aW9uKSB7DQorCQlNYXBwaW5nVmlzdWFsaXphdGlvbiBvbGRNYXBwaW5nVmlzdWFsaXphdGlvbiA9IG1hcHBpbmdWaXN1YWxpemF0aW9uOw0KKwkJbWFwcGluZ1Zpc3VhbGl6YXRpb24gPSBuZXdNYXBwaW5nVmlzdWFsaXphdGlvbiA9PSBudWxsID8gTUFQUElOR19WSVNVQUxJWkFUSU9OX0VERUZBVUxUIDogbmV3TWFwcGluZ1Zpc3VhbGl6YXRpb247DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BUFBJTkdfVklTVUFMSVpBVElPTiwgb2xkTWFwcGluZ1Zpc3VhbGl6YXRpb24sIG1hcHBpbmdWaXN1YWxpemF0aW9uKSk7DQorCQlmb3IgKFBvcnRNYXBwaW5nIG1hcHBpbmcgOiB0aGlzLmdldFBvcnRNYXBwaW5ncygpKSB7DQorCQkJbWFwcGluZy51cGRhdGVWaXN1YWxpemF0aW9uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbUluaXRpYWxDb25kaXRpb24oKSB7DQorCQlyZXR1cm4gY3VzdG9tSW5pdGlhbENvbmRpdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEN1c3RvbUluaXRpYWxDb25kaXRpb24oU3RyaW5nIG5ld0N1c3RvbUluaXRpYWxDb25kaXRpb24pIHsNCisJCVN0cmluZyBvbGRDdXN0b21Jbml0aWFsQ29uZGl0aW9uID0gY3VzdG9tSW5pdGlhbENvbmRpdGlvbjsNCisJCWN1c3RvbUluaXRpYWxDb25kaXRpb24gPSBuZXdDdXN0b21Jbml0aWFsQ29uZGl0aW9uOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fSU5JVElBTF9DT05ESVRJT04sIG9sZEN1c3RvbUluaXRpYWxDb25kaXRpb24sIGN1c3RvbUluaXRpYWxDb25kaXRpb24pKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tRmluYWxDb25kaXRpb24oKSB7DQorCQlyZXR1cm4gY3VzdG9tRmluYWxDb25kaXRpb247DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRDdXN0b21GaW5hbENvbmRpdGlvbihTdHJpbmcgbmV3Q3VzdG9tRmluYWxDb25kaXRpb24pIHsNCisJCVN0cmluZyBvbGRDdXN0b21GaW5hbENvbmRpdGlvbiA9IGN1c3RvbUZpbmFsQ29uZGl0aW9uOw0KKwkJY3VzdG9tRmluYWxDb25kaXRpb24gPSBuZXdDdXN0b21GaW5hbENvbmRpdGlvbjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fQ1VTVE9NX0ZJTkFMX0NPTkRJVElPTiwgb2xkQ3VzdG9tRmluYWxDb25kaXRpb24sIGN1c3RvbUZpbmFsQ29uZGl0aW9uKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJCXJldHVybiBiYXNpY1NldE1haW5SZWZhY3RvcmluZ1VuaXQobnVsbCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fUE9SVF9NQVBQSU5HUzoNCisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQb3J0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01PREVMX1JFRkFDVE9SSU5HUzoNCisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNb2RlbFJlZmFjdG9yaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fSEVMUEVSOg0KKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEhlbHBlcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJCXJldHVybiBnZXRNYWluUmVmYWN0b3JpbmdVbml0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fUE9SVF9NQVBQSU5HUzoNCisJCQkJcmV0dXJuIGdldFBvcnRNYXBwaW5ncygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01PREVMX1JFRkFDVE9SSU5HUzoNCisJCQkJcmV0dXJuIGdldE1vZGVsUmVmYWN0b3JpbmdzKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fSEVMUEVSOg0KKwkJCQlyZXR1cm4gZ2V0SGVscGVyKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fTUFQUElOR19WSVNVQUxJWkFUSU9OOg0KKwkJCQlyZXR1cm4gZ2V0TWFwcGluZ1Zpc3VhbGl6YXRpb24oKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fSU5JVElBTF9DT05ESVRJT046DQorCQkJCXJldHVybiBnZXRDdXN0b21Jbml0aWFsQ29uZGl0aW9uKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fQ1VTVE9NX0ZJTkFMX0NPTkRJVElPTjoNCisJCQkJcmV0dXJuIGdldEN1c3RvbUZpbmFsQ29uZGl0aW9uKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fTUFJTl9SRUZBQ1RPUklOR19VTklUOg0KKwkJCQlzZXRNYWluUmVmYWN0b3JpbmdVbml0KChSZWZhY3RvcmluZ1VuaXQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fUE9SVF9NQVBQSU5HUzoNCisJCQkJZ2V0UG9ydE1hcHBpbmdzKCkuY2xlYXIoKTsNCisJCQkJZ2V0UG9ydE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQb3J0TWFwcGluZz4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fTU9ERUxfUkVGQUNUT1JJTkdTOg0KKwkJCQlnZXRNb2RlbFJlZmFjdG9yaW5ncygpLmNsZWFyKCk7DQorCQkJCWdldE1vZGVsUmVmYWN0b3JpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNb2RlbFJlZmFjdG9yaW5nPiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19IRUxQRVI6DQorCQkJCWdldEhlbHBlcigpLmNsZWFyKCk7DQorCQkJCWdldEhlbHBlcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSGVscGVyPiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQVBQSU5HX1ZJU1VBTElaQVRJT046DQorCQkJCXNldE1hcHBpbmdWaXN1YWxpemF0aW9uKChNYXBwaW5nVmlzdWFsaXphdGlvbiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fSU5JVElBTF9DT05ESVRJT046DQorCQkJCXNldEN1c3RvbUluaXRpYWxDb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fRklOQUxfQ09ORElUSU9OOg0KKwkJCQlzZXRDdXN0b21GaW5hbENvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJCXNldE1haW5SZWZhY3RvcmluZ1VuaXQoKFJlZmFjdG9yaW5nVW5pdCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX1BPUlRfTUFQUElOR1M6DQorCQkJCWdldFBvcnRNYXBwaW5ncygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NT0RFTF9SRUZBQ1RPUklOR1M6DQorCQkJCWdldE1vZGVsUmVmYWN0b3JpbmdzKCkuY2xlYXIoKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX0hFTFBFUjoNCisJCQkJZ2V0SGVscGVyKCkuY2xlYXIoKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BUFBJTkdfVklTVUFMSVpBVElPTjoNCisJCQkJc2V0TWFwcGluZ1Zpc3VhbGl6YXRpb24oTUFQUElOR19WSVNVQUxJWkFUSU9OX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX0NVU1RPTV9JTklUSUFMX0NPTkRJVElPTjoNCisJCQkJc2V0Q3VzdG9tSW5pdGlhbENvbmRpdGlvbihDVVNUT01fSU5JVElBTF9DT05ESVRJT05fRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fQ1VTVE9NX0ZJTkFMX0NPTkRJVElPTjoNCisJCQkJc2V0Q3VzdG9tRmluYWxDb25kaXRpb24oQ1VTVE9NX0ZJTkFMX0NPTkRJVElPTl9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BSU5fUkVGQUNUT1JJTkdfVU5JVDoNCisJCQkJcmV0dXJuIG1haW5SZWZhY3RvcmluZ1VuaXQgIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19QT1JUX01BUFBJTkdTOg0KKwkJCQlyZXR1cm4gcG9ydE1hcHBpbmdzICE9IG51bGwgJiYgIXBvcnRNYXBwaW5ncy5pc0VtcHR5KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklOR19fTU9ERUxfUkVGQUNUT1JJTkdTOg0KKwkJCQlyZXR1cm4gbW9kZWxSZWZhY3RvcmluZ3MgIT0gbnVsbCAmJiAhbW9kZWxSZWZhY3RvcmluZ3MuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX0hFTFBFUjoNCisJCQkJcmV0dXJuIGhlbHBlciAhPSBudWxsICYmICFoZWxwZXIuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX01BUFBJTkdfVklTVUFMSVpBVElPTjoNCisJCQkJcmV0dXJuIG1hcHBpbmdWaXN1YWxpemF0aW9uICE9IE1BUFBJTkdfVklTVUFMSVpBVElPTl9FREVGQVVMVDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19DVVNUT01fSU5JVElBTF9DT05ESVRJT046DQorCQkJCXJldHVybiBDVVNUT01fSU5JVElBTF9DT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGN1c3RvbUluaXRpYWxDb25kaXRpb24gIT0gbnVsbCA6ICFDVVNUT01fSU5JVElBTF9DT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKGN1c3RvbUluaXRpYWxDb25kaXRpb24pOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX0NVU1RPTV9GSU5BTF9DT05ESVRJT046DQorCQkJCXJldHVybiBDVVNUT01fRklOQUxfQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBjdXN0b21GaW5hbENvbmRpdGlvbiAhPSBudWxsIDogIUNVU1RPTV9GSU5BTF9DT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKGN1c3RvbUZpbmFsQ29uZGl0aW9uKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKG1hcHBpbmdWaXN1YWxpemF0aW9uOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQobWFwcGluZ1Zpc3VhbGl6YXRpb24pOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBjdXN0b21Jbml0aWFsQ29uZGl0aW9uOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoY3VzdG9tSW5pdGlhbENvbmRpdGlvbik7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGN1c3RvbUZpbmFsQ29uZGl0aW9uOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoY3VzdG9tRmluYWxDb25kaXRpb24pOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQorCQl0aGlzLnNldE5hbWUobmV3TmFtZSwgdHJ1ZSk7DQorCX0NCisNCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiB1cGRhdGVSb290VW5pdCkgew0KKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOw0KKwkJbmFtZSA9IG5ld05hbWU7DQorCQlpZiAodXBkYXRlUm9vdFVuaXQpIHsNCisJCQlpZiAodGhpcy5nZXRNYWluUmVmYWN0b3JpbmdVbml0KCkgIT0gbnVsbCkgew0KKwkJCQl0aGlzLmdldE1haW5SZWZhY3RvcmluZ1VuaXQoKS5zZXROYW1lKG5ld05hbWUsIGZhbHNlKTsNCisJCQl9DQorCQl9DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19OQU1FLCBvbGROYW1lLA0KKwkJCQkJbmFtZSkpOw0KKw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVcmkoU3RyaW5nIG5ld05hbWVzcGFjZVVyaSkgew0KKwkJaWYgKG5hbWVzcGFjZVVyaSA9PSBudWxsKSB7DQorCQkJU3RyaW5nIG9sZE5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZVVyaTsNCisJCQluYW1lc3BhY2VVcmkgPSBuZXdOYW1lc3BhY2VVcmk7DQorCQkJbnNVcmkgPSBuYW1lc3BhY2VVcmk7DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgNCisJCQkJCQl0aGlzLA0KKwkJCQkJCU5vdGlmaWNhdGlvbi5TRVQsDQorCQkJCQkJQ29tcmVsUGFja2FnZS5DT01QT1NJVEVfUkVGQUNUT1JJTkdfX05BTUVTUEFDRV9VUkksDQorCQkJCQkJb2xkTmFtZXNwYWNlVXJpLCBuYW1lc3BhY2VVcmkpKTsNCisJCX0NCisJfQ0KKwkNCisJLyoqDQorCSAqIEBwYXJhbSBpZA0KKwkgKiBAcmV0dXJuIE1vZGVsUmVmYWN0b3Jpbmcgb2RlciBudWxsLCBmYWxscyBuaWNodCBleGlzdGVudA0KKwkgKi8NCisJcHVibGljIE1vZGVsUmVmYWN0b3JpbmcgZ2V0TW9kZWxSZWZhY3RvcmluZyhTdHJpbmcgaWQpIHsNCisJCWZvciAoTW9kZWxSZWZhY3RvcmluZyByZWYgOiB0aGlzLmdldE1vZGVsUmVmYWN0b3JpbmdzKCkpIHsNCisJCQlpZiAocmVmLmdldFJlZklkKCkuZXF1YWxzKGlkKSkgew0KKwkJCQlyZXR1cm4gcmVmOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAcGFyYW0gaWQNCisJICogICAgICAgICAgICBkZXMgSGVscGVycw0KKwkgKiBAcmV0dXJuIEhlbHBlciBvZGVyIG51bGwsIGZhbGxzIG5pY2h0IGV4aXN0ZW50DQorCSAqLw0KKwlwdWJsaWMgSGVscGVyIGdldEhlbHBlcihTdHJpbmcgaWQpIHsNCisJCWZvciAoSGVscGVyIGggOiB0aGlzLmdldEhlbHBlcigpKSB7DQorCQkJaWYgKGguZ2V0SGVscGVySWQoKS5lcXVhbHMoaWQpKSB7DQorCQkJCXJldHVybiBoOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAcGFyYW0gaWQNCisJICogQHJldHVybiBIZWxwZXIgb2RlciBudWxsLCBmYWxscyBuaWNodCBleGlzdGVudA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVIZWxwZXIgZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcihTdHJpbmcgaWQpIHsNCisJCUhlbHBlciBoID0gdGhpcy5nZXRIZWxwZXIoaWQpOw0KKwkJaWYgKGggIT0gbnVsbCAmJiBoIGluc3RhbmNlb2YgU2luZ2xlRmVhdHVyZUhlbHBlcikgew0KKwkJCXJldHVybiAoU2luZ2xlRmVhdHVyZUhlbHBlcikgaDsNCisJCX0gZWxzZSB7DQorCQkJZm9yIChTaW5nbGVGZWF0dXJlSGVscGVyIGhlbHBlciA6IFJlZ2lzdHJ5VXRpbA0KKwkJCQkJLmxvYWRTaW5nbGVGZWF0dXJlSGVscGVyKCkpIHsNCisJCQkJaWYgKGhlbHBlci5nZXRIZWxwZXJJZCgpLmVxdWFscyhpZCkpDQorCQkJCQlyZXR1cm4gaGVscGVyOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAcGFyYW0gaWQNCisJICogQHJldHVybiBIZWxwZXIgb2RlciBudWxsLCBmYWxscyBuaWNodCBleGlzdGVudA0KKwkgKi8NCisJcHVibGljIE11bHRpRmVhdHVyZUhlbHBlciBnZXRNdWx0aUZlYXR1cmVIZWxwZXIoU3RyaW5nIGlkKSB7DQorCQlIZWxwZXIgaCA9IHRoaXMuZ2V0SGVscGVyKGlkKTsNCisJCWlmIChoICE9IG51bGwgJiYgaCBpbnN0YW5jZW9mIE11bHRpRmVhdHVyZUhlbHBlcikgew0KKwkJCXJldHVybiAoTXVsdGlGZWF0dXJlSGVscGVyKSBoOw0KKwkJfSBlbHNlIHsNCisJCQlmb3IgKE11bHRpRmVhdHVyZUhlbHBlciBoZWxwZXIgOiBSZWdpc3RyeVV0aWwNCisJCQkJCS5sb2FkTXVsdGlGZWF0dXJlSGVscGVyKCkpIHsNCisJCQkJaWYgKGhlbHBlci5nZXRIZWxwZXJJZCgpLmVxdWFscyhpZCkpDQorCQkJCQlyZXR1cm4gaGVscGVyOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAcGFyYW0gaWQNCisJICogQHJldHVybiBIZWxwZXIgb2RlciBudWxsLCBmYWxscyBuaWNodCBleGlzdGVudA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlckhlbHBlciBnZXRTaW5nbGVGaWx0ZXJIZWxwZXIoU3RyaW5nIGlkKSB7DQorCQlIZWxwZXIgaCA9IHRoaXMuZ2V0SGVscGVyKGlkKTsNCisJCWlmIChoICE9IG51bGwgJiYgaCBpbnN0YW5jZW9mIFNpbmdsZUZpbHRlckhlbHBlcikgew0KKwkJCXJldHVybiAoU2luZ2xlRmlsdGVySGVscGVyKSBoOw0KKwkJfSBlbHNlIHsNCisJCQlmb3IgKFNpbmdsZUZpbHRlckhlbHBlciBoZWxwZXIgOiBSZWdpc3RyeVV0aWwNCisJCQkJCS5sb2FkU2luZ2xlRmlsdGVySGVscGVyKCkpIHsNCisJCQkJaWYgKGhlbHBlci5nZXRIZWxwZXJJZCgpLmVxdWFscyhpZCkpDQorCQkJCQlyZXR1cm4gaGVscGVyOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBAcGFyYW0gaWQNCisJICogQHJldHVybiBIZWxwZXIgb2RlciBudWxsLCBmYWxscyBuaWNodCBleGlzdGVudA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVySGVscGVyIGdldE11bHRpRmlsdGVySGVscGVyKFN0cmluZyBpZCkgew0KKwkJSGVscGVyIGggPSB0aGlzLmdldEhlbHBlcihpZCk7DQorCQlpZiAoaCAhPSBudWxsICYmIGggaW5zdGFuY2VvZiBNdWx0aUZpbHRlckhlbHBlcikgew0KKwkJCXJldHVybiAoTXVsdGlGaWx0ZXJIZWxwZXIpIGg7DQorCQl9IGVsc2Ugew0KKwkJCWZvciAoTXVsdGlGaWx0ZXJIZWxwZXIgaGVscGVyIDogUmVnaXN0cnlVdGlsDQorCQkJCQkubG9hZE11bHRpRmlsdGVySGVscGVyKCkpIHsNCisJCQkJaWYgKGhlbHBlci5nZXRIZWxwZXJJZCgpLmVxdWFscyhpZCkpDQorCQkJCQlyZXR1cm4gaGVscGVyOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBMaWVmZXJ0IGFsbGUgTW9kZWxSZWZhY3RvcmluZ3MgdXNlc2VzIEVtZlJlZmFjdG9yLUV4dGVuc2lvblBvaW50DQorCSAqLw0KKwlwdWJsaWMgQ29sbGVjdGlvbjxNb2RlbFJlZmFjdG9yaW5nPiBnZXRFbWZSZWZhY3RvcmluZ3NBc01vZGVsUmVmYWN0b3JpbmdzKCkgew0KKwkJcmV0dXJuIFJlZ2lzdHJ5VXRpbC5nZXRFbWZSZWZhY3RvcmluZ3NBc01vZGVsUmVmYWN0b3JpbmdzKCk7DQorCX0NCisNCisJLyoqDQorCSAqIExpZWZlcnQgZGFzIE1vZGVsUmVmYWN0b3JpbmcgenVyIGdlZ2ViZW5lciBJRA0KKwkgKi8NCisJcHVibGljIE1vZGVsUmVmYWN0b3JpbmcgZ2V0RW1mUmVmYWN0b3JpbmdBc01vZGVsUmVmYWN0b3JpbmcoU3RyaW5nIGlkKSB7DQorCQlmb3IgKE1vZGVsUmVmYWN0b3JpbmcgcmVmIDogdGhpcy5nZXRNb2RlbFJlZmFjdG9yaW5ncygpKSB7DQorCQkJaWYgKHJlZi5nZXRSZWZJZCgpLmVxdWFscyhpZCkpIHsNCisJCQkJcmV0dXJuIHJlZjsNCisJCQl9DQorCQl9DQorCQlmb3IgKE1vZGVsUmVmYWN0b3JpbmcgcmVmIDogdGhpcy5nZXRFbWZSZWZhY3RvcmluZ3NBc01vZGVsUmVmYWN0b3JpbmdzKCkpIHsNCisJCQlpZiAocmVmLmdldFJlZklkKCkuZXF1YWxzKGlkKSkgew0KKwkJCQlyZXR1cm4gcmVmOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBMb29rIHVwLCBpZiB0aGUgTW9kZWxSZWZhY3RvcmluZyBpbiB1c2UNCisJICovDQorCXB1YmxpYyBib29sZWFuIG1vZGVsUmVmYWN0b3JpbmdJblVzZShNb2RlbFJlZmFjdG9yaW5nIHJlZiwNCisJCQlBdG9taWNVbml0IGNvbnRleHQpIHsNCisJCUF0b21pY1VuaXQgYXRvbWljVW5pdDsNCisJCWZvciAoUmVmYWN0b3JpbmdVbml0IHJlZlVuaXQgOiB0aGlzLmdldEFsbFJlZmFjdG9yaW5nVW5pdHMoKSkgew0KKwkJCWlmIChyZWZVbml0IGluc3RhbmNlb2YgQXRvbWljVW5pdCkgew0KKwkJCQlhdG9taWNVbml0ID0gKEF0b21pY1VuaXQpIHJlZlVuaXQ7DQorCQkJCWlmIChhdG9taWNVbml0LmdldE1vZGVsUmVmYWN0b3JpbmcoKSA9PSByZWYNCisJCQkJCQkmJiAhKGNvbnRleHQgPT0gYXRvbWljVW5pdCkpIHsNCisJCQkJCXJldHVybiB0cnVlOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBMb29rIHVwLCBpZiB0aGUgaGVscGVyIGluIHVzZQ0KKwkgKi8NCisJcHVibGljIGJvb2xlYW4gaGVscGVySW5Vc2UoSGVscGVyIGhlbHBlciwgSGVscGVyVW5pdCBjb250ZXh0KSB7DQorCQlmb3IgKEhlbHBlclVuaXQgaGVscGVyVW5pdCA6IHRoaXMuZ2V0QWxsSGVscGVyVW5pdHMoKSkgew0KKwkJCWlmICh0aGlzLmdldEhlbHBlcihoZWxwZXJVbml0LmdldEhlbHBlclVuaXRJZCgpKSA9PSBoZWxwZXINCisJCQkJCSYmIGhlbHBlclVuaXQgIT0gY29udGV4dCkgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIExpZWZlcnQgYWxsZSBkaXJla3RlbiB1bmQgaW5kaXJla3RlbiBSZWZhY3RvcmluZ1VuaXRzDQorCSAqIA0KKwkgKiBAcmV0dXJuIFJlZmFjdG9yaW5nVW5pdHMNCisJICovDQorCXByaXZhdGUgTGlzdDxSZWZhY3RvcmluZ1VuaXQ+IGdldEFsbFJlZmFjdG9yaW5nVW5pdHMoKSB7DQorCQlBcnJheUxpc3Q8UmVmYWN0b3JpbmdVbml0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFJlZmFjdG9yaW5nVW5pdD4oKTsNCisJCVN0YWNrPFJlZmFjdG9yaW5nVW5pdD4gc3RhY2sgPSBuZXcgU3RhY2s8UmVmYWN0b3JpbmdVbml0PigpOw0KKwkJUmVmYWN0b3JpbmdVbml0IHJlZlVuaXQ7DQorCQlyZWZVbml0ID0gdGhpcy5nZXRNYWluUmVmYWN0b3JpbmdVbml0KCk7DQorDQorCQlTZXF1ZW50aWFsVW5pdCBzZXFVbml0Ow0KKwkJaWYgKHJlZlVuaXQgIT0gbnVsbCkgew0KKwkJCXN0YWNrLnB1c2gocmVmVW5pdCk7DQorCQl9DQorCQl3aGlsZSAoIXN0YWNrLmlzRW1wdHkoKSkgew0KKwkJCXJlZlVuaXQgPSBzdGFjay5wb3AoKTsNCisJCQlyZXN1bHQuYWRkKHJlZlVuaXQpOw0KKwkJCWlmIChyZWZVbml0IGluc3RhbmNlb2YgU2VxdWVudGlhbFVuaXQpIHsNCisJCQkJc2VxVW5pdCA9IChTZXF1ZW50aWFsVW5pdCkgcmVmVW5pdDsNCisJCQkJZm9yIChSZWZhY3RvcmluZ1VuaXQgclUgOiBzZXFVbml0LmdldFJlZmFjdG9yaW5nVW5pdHMoKSkgew0KKwkJCQkJc3RhY2sucHVzaChyVSk7DQorCQkJCX0NCisJCQl9DQorCQkJaWYgKHJlZlVuaXQgaW5zdGFuY2VvZiBTaW5nbGVRdWV1ZWRVbml0KSB7DQorCQkJCVNpbmdsZVF1ZXVlZFVuaXQgcXVldWVkVW5pdCA9IChTaW5nbGVRdWV1ZWRVbml0KSByZWZVbml0Ow0KKwkJCQlzdGFjay5wdXNoKHF1ZXVlZFVuaXQuZ2V0UmVmYWN0b3JpbmdVbml0KCkpOw0KKwkJCX0NCisJCQlpZiAocmVmVW5pdCBpbnN0YW5jZW9mIFBhcmFsbGVsUXVldWVkVW5pdCkgew0KKwkJCQlQYXJhbGxlbFF1ZXVlZFVuaXQgcXVldWVkVW5pdCA9IChQYXJhbGxlbFF1ZXVlZFVuaXQpIHJlZlVuaXQ7DQorCQkJCXN0YWNrLnB1c2gocXVldWVkVW5pdC5nZXRSZWZhY3RvcmluZ1VuaXRzKCkpOw0KKwkJCX0NCisJCQlpZiAocmVmVW5pdCBpbnN0YW5jZW9mIENhcnRlc2lhblF1ZXVlZFVuaXQpIHsNCisJCQkJQ2FydGVzaWFuUXVldWVkVW5pdCBxdWV1ZWRVbml0ID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpIHJlZlVuaXQ7DQorCQkJCXN0YWNrLnB1c2gocXVldWVkVW5pdC5nZXRSZWZhY3RvcmluZ1VuaXQoKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogTGllZmVydCBhbGxlIGRpcmVrdGVuIHVuZCBpbmRpcmVrdGVuIEhlbHBlclVuaXRzDQorCSAqIA0KKwkgKiBAcmV0dXJuIEhlbHBlclVuaXRzDQorCSAqLw0KKwlwcml2YXRlIExpc3Q8SGVscGVyVW5pdD4gZ2V0QWxsSGVscGVyVW5pdHMoKSB7DQorCQlBcnJheUxpc3Q8SGVscGVyVW5pdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxIZWxwZXJVbml0PigpOw0KKwkJQ29tcG9zaXRlVW5pdCBjb21wb3NpdGVVbml0Ow0KKwkJZm9yIChSZWZhY3RvcmluZ1VuaXQgdW5pdCA6IHRoaXMuZ2V0QWxsUmVmYWN0b3JpbmdVbml0cygpKSB7DQorCQkJaWYgKHVuaXQgaW5zdGFuY2VvZiBDb21wb3NpdGVVbml0KSB7DQorCQkJCWNvbXBvc2l0ZVVuaXQgPSAoQ29tcG9zaXRlVW5pdCkgdW5pdDsNCisJCQkJcmVzdWx0LmFkZEFsbChjb21wb3NpdGVVbml0LmdldEhlbHBlclVuaXRzKCkpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIExpZWZlcnQgYWxsZSB1bmJlbnV0enRlbiBNb2RlbFJlZmFjdG9yaW5ncw0KKwkgKiANCisJICogQHJldHVybg0KKwkgKi8NCisJcHVibGljIExpc3Q8TW9kZWxSZWZhY3RvcmluZz4gZ2V0VW51c2VkTW9kZWxSZWZhY3RvcmluZ3MoKSB7DQorCQlBcnJheUxpc3Q8TW9kZWxSZWZhY3RvcmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFJlZmFjdG9yaW5nPigpOw0KKwkJZm9yIChNb2RlbFJlZmFjdG9yaW5nIG1yIDogdGhpcy5nZXRNb2RlbFJlZmFjdG9yaW5ncygpKSB7DQorCQkJaWYgKCEobW9kZWxSZWZhY3RvcmluZ0luVXNlKG1yLCBudWxsKSkpIHsNCisJCQkJcmVzdWx0LmFkZChtcik7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogTGllZmVydCBhbGxlIHVuYmVudXR6dGVuIEhlbHBlcg0KKwkgKiANCisJICogQHJldHVybg0KKwkgKi8NCisJcHVibGljIExpc3Q8SGVscGVyPiBnZXRVbnVzZWRIZWxwZXIoKSB7DQorCQlBcnJheUxpc3Q8SGVscGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEhlbHBlcj4oKTsNCisJCWZvciAoSGVscGVyIGhlbHBlciA6IHRoaXMuZ2V0SGVscGVyKCkpIHsNCisJCQlpZiAoIWhlbHBlckluVXNlKGhlbHBlciwgbnVsbCkpIHsNCisJCQkJcmVzdWx0LmFkZChoZWxwZXIpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIEVudGZlcm50IGFsbGUgdW5iZW51dHp0ZW4gTW9kZWxSZWZhY3RvcmluZ3MNCisJICovDQorCXB1YmxpYyB2b2lkIHJlbW92ZVVudXNlZE1vZGVsUmVmYWN0b3JpbmdzKCkgew0KKwkJdGhpcy5nZXRNb2RlbFJlZmFjdG9yaW5ncygpLnJlbW92ZUFsbCgNCisJCQkJdGhpcy5nZXRVbnVzZWRNb2RlbFJlZmFjdG9yaW5ncygpKTsNCisJfQ0KKw0KKwkvKioNCisJICogRW50ZmVybnQgYWxsZSB1bmJlbnR6dGVuIEhlbHBlcg0KKwkgKi8NCisJcHVibGljIHZvaWQgcmVtb3ZlVW51c2VkSGVscGVyKCkgew0KKwkJdGhpcy5nZXRIZWxwZXIoKS5yZW1vdmVBbGwodGhpcy5nZXRVbnVzZWRIZWxwZXIoKSk7DQorCX0NCisNCisJcHVibGljIHZvaWQgc2V0TWFwcGluZ051bWJlcnMoU2V0PEludGVnZXI+IG1hcHBpbmdOdW1iZXJzKSB7DQorCQl0aGlzLm1hcHBpbmdOdW1iZXJzID0gbWFwcGluZ051bWJlcnM7DQorCX0NCisNCisJcHVibGljIFNldDxJbnRlZ2VyPiBnZXRNYXBwaW5nTnVtYmVycygpIHsNCisJCXJldHVybiBtYXBwaW5nTnVtYmVyczsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBjbGVhblVwTWFwcGluZ051bWJlcnMoKSB7DQorCQlTZXQ8SW50ZWdlcj4gc2V0ID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsNCisJCWZvciAoUG9ydE1hcHBpbmcgbWFwcGluZyA6IHRoaXMuZ2V0UG9ydE1hcHBpbmdzKCkpIHsNCisJCQlzZXQuYWRkKG1hcHBpbmcuZ2V0TWFwcGluZ051bWJlcigpKTsNCisJCX0NCisJCXRoaXMuc2V0TWFwcGluZ051bWJlcnMoc2V0KTsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCB1cGRhdGVWaXN1YWxpemF0aW9uKCkgew0KKwkJdGhpcy5jbGVhblVwTWFwcGluZ051bWJlcnMoKTsNCisJCWZvciAoUG9ydE1hcHBpbmcgbWFwcGluZyA6IHRoaXMuZ2V0UG9ydE1hcHBpbmdzKCkpIHsNCisJCQlpZihtYXBwaW5nLmdldE1hcHBpbmdOdW1iZXIoKSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgew0KKwkJCQltYXBwaW5nLnVwZGF0ZU1hcHBpbmdOdW1iZXIoKTsNCisJCQl9DQorCQkJbWFwcGluZy51cGRhdGVWaXN1YWxpemF0aW9uKCk7DQorCQl9DQorCQl1cGRhdGVTZXF1ZW50aWFsT3JkZXJWaXN1YWxpemF0aW9uKCk7DQorCX0NCisJDQorCXByaXZhdGUgdm9pZCB1cGRhdGVTZXF1ZW50aWFsT3JkZXJWaXN1YWxpemF0aW9uKCl7DQorCQlTZXF1ZW50aWFsVW5pdCBzZXE7DQorCQlmb3IoUmVmYWN0b3JpbmdVbml0IHVuaXQgOiB0aGlzLmdldEFsbFJlZmFjdG9yaW5nVW5pdHMoKSkgew0KKwkJCWlmKHVuaXQgaW5zdGFuY2VvZiBTZXF1ZW50aWFsVW5pdCkgew0KKwkJCQlzZXEgPSAoU2VxdWVudGlhbFVuaXQpIHVuaXQ7DQorCQkJCXNlcS51cGRhdGVTZXFFeGVjdXRpb25PcmRlcigpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KK30gLy9Db21wb3NpdGVSZWZhY3RvcmluZ0ltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Db21wb3NpdGVVbml0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29tcG9zaXRlVW5pdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2E4NThhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29tcG9zaXRlVW5pdEltcGwuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVVbml0Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb3NpdGVVbml0SW1wbCBleHRlbmRzIFJlZmFjdG9yaW5nVW5pdEltcGwgaW1wbGVtZW50cyBDb21wb3NpdGVVbml0IHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlVW5pdEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1VOSVQ7DQorCX0NCisNCit9IC8vQ29tcG9zaXRlVW5pdEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Db21yZWxGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29tcmVsRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzdhZjhhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29tcmVsRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDU0OSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuKjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+Lg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBDb21yZWxGYWN0b3J5IHsNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29tcmVsRmFjdG9yeSBpbml0KCkgew0KKwkJdHJ5IHsNCisJCQlDb21yZWxGYWN0b3J5IHRoZUNvbXJlbEZhY3RvcnkgPSAoQ29tcmVsRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2NvbXJlbC8wLjEiKTsgDQorCQkJaWYgKHRoZUNvbXJlbEZhY3RvcnkgIT0gbnVsbCkgew0KKwkJCQlyZXR1cm4gdGhlQ29tcmVsRmFjdG9yeTsNCisJCQl9DQorCQl9DQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KKwkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KKwkJfQ0KKwkJcmV0dXJuIG5ldyBDb21yZWxGYWN0b3J5SW1wbCgpOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbEZhY3RvcnlJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgew0KKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09NUE9TSVRFX1JFRkFDVE9SSU5HOiByZXR1cm4gY3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmcoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkc6IHJldHVybiBjcmVhdGVNb2RlbFJlZmFjdG9yaW5nKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkFUT01JQ19VTklUOiByZXR1cm4gY3JlYXRlQXRvbWljVW5pdCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVQ6IHJldHVybiBjcmVhdGVTZXF1ZW50aWFsVW5pdCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0s6IHJldHVybiBjcmVhdGVDb25kaXRpb25DaGVjaygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUOiByZXR1cm4gY3JlYXRlQ29uZGl0aW9uYWxVbml0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVDogcmV0dXJuIGNyZWF0ZVNpbmdsZVF1ZXVlZFVuaXQoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ0FSVEVTSUFOX1FVRVVFRF9VTklUOiByZXR1cm4gY3JlYXRlQ2FydGVzaWFuUXVldWVkVW5pdCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVDogcmV0dXJuIGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUOiByZXR1cm4gY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUOiByZXR1cm4gY3JlYXRlTXVsdGlGZWF0dXJlVW5pdCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVQ6IHJldHVybiBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUOiByZXR1cm4gY3JlYXRlTXVsdGlGaWx0ZXJVbml0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX0hFTFBFUjogcmV0dXJuIGNyZWF0ZVNpbmdsZUZlYXR1cmVIZWxwZXIoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9IRUxQRVI6IHJldHVybiBjcmVhdGVNdWx0aUZlYXR1cmVIZWxwZXIoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9IRUxQRVI6IHJldHVybiBjcmVhdGVTaW5nbGVGaWx0ZXJIZWxwZXIoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX0hFTFBFUjogcmV0dXJuIGNyZWF0ZU11bHRpRmlsdGVySGVscGVyKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9JTlBVVF9QT1JUOiByZXR1cm4gY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0lOUFVUX1BPUlQ6IHJldHVybiBjcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfT1VUUFVUX1BPUlQ6IHJldHVybiBjcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX09VVFBVVF9QT1JUOiByZXR1cm4gY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX01BUFBJTkc6IHJldHVybiBjcmVhdGVTaW5nbGVQb3J0TWFwcGluZygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX01BUFBJTkc6IHJldHVybiBjcmVhdGVNdWx0aVBvcnRNYXBwaW5nKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkc6IHJldHVybiBjcmVhdGVNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKCk7DQorCQkJZGVmYXVsdDoNCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTUFQUElOR19WSVNVQUxJWkFUSU9OOg0KKwkJCQlyZXR1cm4gY3JlYXRlTWFwcGluZ1Zpc3VhbGl6YXRpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsNCisJCQlkZWZhdWx0Og0KKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQorCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NQVBQSU5HX1ZJU1VBTElaQVRJT046DQorCQkJCXJldHVybiBjb252ZXJ0TWFwcGluZ1Zpc3VhbGl6YXRpb25Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KKwkJCWRlZmF1bHQ6DQorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcG9zaXRlUmVmYWN0b3JpbmcgY3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmcoKSB7DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZ0ltcGwgY29tcG9zaXRlUmVmYWN0b3JpbmcgPSBuZXcgQ29tcG9zaXRlUmVmYWN0b3JpbmdJbXBsKCk7DQorCQlyZXR1cm4gY29tcG9zaXRlUmVmYWN0b3Jpbmc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTW9kZWxSZWZhY3RvcmluZyBjcmVhdGVNb2RlbFJlZmFjdG9yaW5nKCkgew0KKwkJTW9kZWxSZWZhY3RvcmluZ0ltcGwgbW9kZWxSZWZhY3RvcmluZyA9IG5ldyBNb2RlbFJlZmFjdG9yaW5nSW1wbCgpOw0KKwkJcmV0dXJuIG1vZGVsUmVmYWN0b3Jpbmc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQXRvbWljVW5pdCBjcmVhdGVBdG9taWNVbml0KCkgew0KKwkJQXRvbWljVW5pdEltcGwgYXRvbWljVW5pdCA9IG5ldyBBdG9taWNVbml0SW1wbCgpOw0KKwkJcmV0dXJuIGF0b21pY1VuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2VxdWVudGlhbFVuaXQgY3JlYXRlU2VxdWVudGlhbFVuaXQoKSB7DQorCQlTZXF1ZW50aWFsVW5pdEltcGwgc2VxdWVudGlhbFVuaXQgPSBuZXcgU2VxdWVudGlhbFVuaXRJbXBsKCk7DQorCQlyZXR1cm4gc2VxdWVudGlhbFVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uQ2hlY2sgY3JlYXRlQ29uZGl0aW9uQ2hlY2soKSB7DQorCQlDb25kaXRpb25DaGVja0ltcGwgY29uZGl0aW9uQ2hlY2sgPSBuZXcgQ29uZGl0aW9uQ2hlY2tJbXBsKCk7DQorCQlyZXR1cm4gY29uZGl0aW9uQ2hlY2s7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uYWxVbml0IGNyZWF0ZUNvbmRpdGlvbmFsVW5pdCgpIHsNCisJCUNvbmRpdGlvbmFsVW5pdEltcGwgY29uZGl0aW9uYWxVbml0ID0gbmV3IENvbmRpdGlvbmFsVW5pdEltcGwoKTsNCisJCXJldHVybiBjb25kaXRpb25hbFVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUXVldWVkVW5pdCBjcmVhdGVTaW5nbGVRdWV1ZWRVbml0KCkgew0KKwkJU2luZ2xlUXVldWVkVW5pdEltcGwgc2luZ2xlUXVldWVkVW5pdCA9IG5ldyBTaW5nbGVRdWV1ZWRVbml0SW1wbCgpOw0KKwkJc2luZ2xlUXVldWVkVW5pdC5zZXRNdWx0aUlucHV0UG9ydChuZXcgTXVsdGlJbnB1dFBvcnRJbXBsKCkpOw0KKwkJcmV0dXJuIHNpbmdsZVF1ZXVlZFVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ2FydGVzaWFuUXVldWVkVW5pdCBjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0KCkgew0KKwkJQ2FydGVzaWFuUXVldWVkVW5pdEltcGwgY2FydGVzaWFuUXVldWVkVW5pdCA9IG5ldyBDYXJ0ZXNpYW5RdWV1ZWRVbml0SW1wbCgpOw0KKwkJLy8gVE9ETw0KKwkJcmV0dXJuIGNhcnRlc2lhblF1ZXVlZFVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUGFyYWxsZWxRdWV1ZWRVbml0IGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdCgpIHsNCisJCVBhcmFsbGVsUXVldWVkVW5pdEltcGwgcGFyYWxsZWxRdWV1ZWRVbml0ID0gbmV3IFBhcmFsbGVsUXVldWVkVW5pdEltcGwoKTsNCisJCS8vIFRPRE8NCisJCXJldHVybiBwYXJhbGxlbFF1ZXVlZFVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZVVuaXQgY3JlYXRlU2luZ2xlRmVhdHVyZVVuaXQoKSB7DQorCQlTaW5nbGVGZWF0dXJlVW5pdEltcGwgc2luZ2xlRmVhdHVyZVVuaXQgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRJbXBsKCk7DQorCQkNCisJCVNpbmdsZUlucHV0UG9ydCBpblBvcnQgPSB0aGlzLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKwkJaW5Qb3J0LnNldE5hbWUoIkR1bW15Iik7DQorCQlpblBvcnQuc2V0RGVzY3JpcHRpb24oIkR1bW15Iik7DQorCQlpblBvcnQuc2V0VHlwZShTdHJpbmcuY2xhc3MpOw0KKwkJaW5Qb3J0LnNldFZhbHVlKG5ldyBTdHJpbmcoIkR1bW15IikpOw0KKwkJc2luZ2xlRmVhdHVyZVVuaXQuc2V0SW5wdXRQb3J0KGluUG9ydCk7DQorCQkNCisJCVNpbmdsZU91dHB1dFBvcnQgb3V0UG9ydCA9IHRoaXMuY3JlYXRlU2luZ2xlT3V0cHV0UG9ydCgpOw0KKwkJb3V0UG9ydC5zZXROYW1lKCJEdW1teSIpOw0KKwkJb3V0UG9ydC5zZXREZXNjcmlwdGlvbigiRHVtbXkiKTsNCisJCW91dFBvcnQuc2V0VHlwZShTdHJpbmcuY2xhc3MpOw0KKwkJb3V0UG9ydC5zZXRWYWx1ZShuZXcgU3RyaW5nKCJEdW1teSIpKTsNCisJCXNpbmdsZUZlYXR1cmVVbml0LnNldE91dHB1dFBvcnQob3V0UG9ydCk7DQorCQkNCisJCXJldHVybiBzaW5nbGVGZWF0dXJlVW5pdDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVVbml0IGNyZWF0ZU11bHRpRmVhdHVyZVVuaXQoKSB7DQorCQlNdWx0aUZlYXR1cmVVbml0SW1wbCBtdWx0aUZlYXR1cmVVbml0ID0gbmV3IE11bHRpRmVhdHVyZVVuaXRJbXBsKCk7DQorCQkNCisJCVNpbmdsZUlucHV0UG9ydCBpblBvcnQgPSB0aGlzLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKwkJaW5Qb3J0LnNldE5hbWUoIkR1bW15Iik7DQorCQlpblBvcnQuc2V0RGVzY3JpcHRpb24oIkR1bW15Iik7DQorCQlpblBvcnQuc2V0VHlwZShTdHJpbmcuY2xhc3MpOw0KKwkJaW5Qb3J0LnNldFZhbHVlKG5ldyBTdHJpbmcoIkR1bW15IikpOw0KKwkJbXVsdGlGZWF0dXJlVW5pdC5zZXRJbnB1dFBvcnQoaW5Qb3J0KTsNCisJCQ0KKwkJTXVsdGlPdXRwdXRQb3J0IG91dFBvcnQgPSB0aGlzLmNyZWF0ZU11bHRpT3V0cHV0UG9ydCgpOw0KKwkJb3V0UG9ydC5zZXROYW1lKCJEdW1teSIpOw0KKwkJb3V0UG9ydC5zZXREZXNjcmlwdGlvbigiRHVtbXkiKTsNCisJCW91dFBvcnQuc2V0VHlwZShTdHJpbmcuY2xhc3MpOw0KKwkJb3V0UG9ydC5nZXRWYWx1ZSgpLmFkZCgiRHVtbXkiKTsNCisJCW11bHRpRmVhdHVyZVVuaXQuc2V0T3V0cHV0UG9ydChvdXRQb3J0KTsNCisJCQ0KKwkJcmV0dXJuIG11bHRpRmVhdHVyZVVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdCBjcmVhdGVTaW5nbGVGaWx0ZXJVbml0KCkgew0KKwkJU2luZ2xlRmlsdGVyVW5pdEltcGwgc2luZ2xlRmlsdGVyVW5pdCA9IG5ldyBTaW5nbGVGaWx0ZXJVbml0SW1wbCgpOw0KKwkJcmV0dXJuIHNpbmdsZUZpbHRlclVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJVbml0IGNyZWF0ZU11bHRpRmlsdGVyVW5pdCgpIHsNCisJCU11bHRpRmlsdGVyVW5pdEltcGwgbXVsdGlGaWx0ZXJVbml0ID0gbmV3IE11bHRpRmlsdGVyVW5pdEltcGwoKTsNCisJCXJldHVybiBtdWx0aUZpbHRlclVuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmVhdHVyZUhlbHBlciBjcmVhdGVTaW5nbGVGZWF0dXJlSGVscGVyKCkgew0KKwkJU2luZ2xlRmVhdHVyZUhlbHBlckltcGwgc2luZ2xlRmVhdHVyZUhlbHBlciA9IG5ldyBTaW5nbGVGZWF0dXJlSGVscGVySW1wbCgpOw0KKwkJcmV0dXJuIHNpbmdsZUZlYXR1cmVIZWxwZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGZWF0dXJlSGVscGVyIGNyZWF0ZU11bHRpRmVhdHVyZUhlbHBlcigpIHsNCisJCU11bHRpRmVhdHVyZUhlbHBlckltcGwgbXVsdGlGZWF0dXJlSGVscGVyID0gbmV3IE11bHRpRmVhdHVyZUhlbHBlckltcGwoKTsNCisJCXJldHVybiBtdWx0aUZlYXR1cmVIZWxwZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVySGVscGVyIGNyZWF0ZVNpbmdsZUZpbHRlckhlbHBlcigpIHsNCisJCVNpbmdsZUZpbHRlckhlbHBlckltcGwgc2luZ2xlRmlsdGVySGVscGVyID0gbmV3IFNpbmdsZUZpbHRlckhlbHBlckltcGwoKTsNCisJCXJldHVybiBzaW5nbGVGaWx0ZXJIZWxwZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJIZWxwZXIgY3JlYXRlTXVsdGlGaWx0ZXJIZWxwZXIoKSB7DQorCQlNdWx0aUZpbHRlckhlbHBlckltcGwgbXVsdGlGaWx0ZXJIZWxwZXIgPSBuZXcgTXVsdGlGaWx0ZXJIZWxwZXJJbXBsKCk7DQorCQlyZXR1cm4gbXVsdGlGaWx0ZXJIZWxwZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0IGNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpIHsNCisJCVNpbmdsZUlucHV0UG9ydEltcGwgc2luZ2xlSW5wdXRQb3J0ID0gbmV3IFNpbmdsZUlucHV0UG9ydEltcGwoKTsNCisJCXJldHVybiBzaW5nbGVJbnB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQgY3JlYXRlTXVsdGlJbnB1dFBvcnQoKSB7DQorCQlNdWx0aUlucHV0UG9ydEltcGwgbXVsdGlJbnB1dFBvcnQgPSBuZXcgTXVsdGlJbnB1dFBvcnRJbXBsKCk7DQorCQlyZXR1cm4gbXVsdGlJbnB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydCBjcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCkgew0KKwkJU2luZ2xlT3V0cHV0UG9ydEltcGwgc2luZ2xlT3V0cHV0UG9ydCA9IG5ldyBTaW5nbGVPdXRwdXRQb3J0SW1wbCgpOw0KKwkJcmV0dXJuIHNpbmdsZU91dHB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0IGNyZWF0ZU11bHRpT3V0cHV0UG9ydCgpIHsNCisJCU11bHRpT3V0cHV0UG9ydEltcGwgbXVsdGlPdXRwdXRQb3J0ID0gbmV3IE11bHRpT3V0cHV0UG9ydEltcGwoKTsNCisJCXJldHVybiBtdWx0aU91dHB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUG9ydE1hcHBpbmcgY3JlYXRlU2luZ2xlUG9ydE1hcHBpbmcoKSB7DQorCQlTaW5nbGVQb3J0TWFwcGluZ0ltcGwgc2luZ2xlUG9ydE1hcHBpbmcgPSBuZXcgU2luZ2xlUG9ydE1hcHBpbmdJbXBsKCk7DQorCQlyZXR1cm4gc2luZ2xlUG9ydE1hcHBpbmc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlQb3J0TWFwcGluZyBjcmVhdGVNdWx0aVBvcnRNYXBwaW5nKCkgew0KKwkJTXVsdGlQb3J0TWFwcGluZ0ltcGwgbXVsdGlQb3J0TWFwcGluZyA9IG5ldyBNdWx0aVBvcnRNYXBwaW5nSW1wbCgpOw0KKwkJcmV0dXJuIG11bHRpUG9ydE1hcHBpbmc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlTaW5nbGVQb3J0TWFwcGluZyBjcmVhdGVNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKCkgew0KKwkJTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0ltcGwgbXVsdGlTaW5nbGVQb3J0TWFwcGluZyA9IG5ldyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nSW1wbCgpOw0KKwkJcmV0dXJuIG11bHRpU2luZ2xlUG9ydE1hcHBpbmc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTWFwcGluZ1Zpc3VhbGl6YXRpb24gY3JlYXRlTWFwcGluZ1Zpc3VhbGl6YXRpb25Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCisJCU1hcHBpbmdWaXN1YWxpemF0aW9uIHJlc3VsdCA9IE1hcHBpbmdWaXN1YWxpemF0aW9uLmdldChpbml0aWFsVmFsdWUpOw0KKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBjb252ZXJ0TWFwcGluZ1Zpc3VhbGl6YXRpb25Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgew0KKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcmVsUGFja2FnZSBnZXRDb21yZWxQYWNrYWdlKCkgew0KKwkJcmV0dXJuIChDb21yZWxQYWNrYWdlKWdldEVQYWNrYWdlKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZGVwcmVjYXRlZA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlARGVwcmVjYXRlZA0KKwlwdWJsaWMgc3RhdGljIENvbXJlbFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLmVJTlNUQU5DRTsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE1vZGVsUmVmYWN0b3JpbmcgY3JlYXRlTW9kZWxSZWZhY3RvcmluZyhTdHJpbmcgaWQpIHsNCisJCU1vZGVsUmVmYWN0b3JpbmcgbW9kZWxSZWZhY3RvcmluZyA9IG5ldyBNb2RlbFJlZmFjdG9yaW5nSW1wbChpZCk7DQorCQlpZihtb2RlbFJlZmFjdG9yaW5nLmdldElucHV0UG9ydHMoKS5zaXplKCk9PTApIHsNCisJCQlTaW5nbGVJbnB1dFBvcnQgcG9ydCA9IG5ldyBTaW5nbGVJbnB1dFBvcnRJbXBsKCk7DQorCQkJcG9ydC5zZXROYW1lKCJEdW1teSIpOw0KKwkJCXBvcnQuc2V0RGVzY3JpcHRpb24oIkR1bW15Iik7DQorCQkJcG9ydC5zZXRUeXBlKFN0cmluZy5jbGFzcyk7DQorCQkJcG9ydC5zZXRWYWx1ZSgiRHVtbXkiKTsNCisJCX0NCisJCXJldHVybiBtb2RlbFJlZmFjdG9yaW5nOw0KKwl9DQorDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgQXRvbWljVW5pdCBjcmVhdGVBdG9taWNVbml0KE1vZGVsUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcpIHsNCisJCUF0b21pY1VuaXQgYXRvbWljVW5pdCA9IG5ldyBBdG9taWNVbml0SW1wbChyZWZhY3RvcmluZyk7DQorCQlyZXR1cm4gYXRvbWljVW5pdDsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFNpbmdsZUZlYXR1cmVVbml0IGNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0KFNpbmdsZUZlYXR1cmVIZWxwZXIgaGVscGVyKSB7DQorCQlTaW5nbGVGZWF0dXJlVW5pdEltcGwgc2luZ2xlRmVhdHVyZVVuaXQgPSBuZXcgU2luZ2xlRmVhdHVyZVVuaXRJbXBsKGhlbHBlcik7DQorCQlpZihzaW5nbGVGZWF0dXJlVW5pdC5nZXRJbnB1dFBvcnQoKSA9PSBudWxsKSB7DQorCQkJU2luZ2xlSW5wdXRQb3J0IGluUG9ydCA9IHRoaXMuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCk7DQorCQkJaW5Qb3J0LnNldE5hbWUoIkR1bW15Iik7DQorCQkJaW5Qb3J0LnNldERlc2NyaXB0aW9uKCJEdW1teSIpOw0KKwkJCWluUG9ydC5zZXRUeXBlKFN0cmluZy5jbGFzcyk7DQorCQkJaW5Qb3J0LnNldFZhbHVlKG5ldyBTdHJpbmcoIkR1bW15IikpOw0KKwkJCXNpbmdsZUZlYXR1cmVVbml0LnNldElucHV0UG9ydChpblBvcnQpOw0KKwkJfQ0KKwkJaWYoc2luZ2xlRmVhdHVyZVVuaXQuZ2V0T3V0cHV0UG9ydCgpID09IG51bGwpIHsNCisJCQlTaW5nbGVPdXRwdXRQb3J0IG91dFBvcnQgPSB0aGlzLmNyZWF0ZVNpbmdsZU91dHB1dFBvcnQoKTsNCisJCQlvdXRQb3J0LnNldE5hbWUoIkR1bW15Iik7DQorCQkJb3V0UG9ydC5zZXREZXNjcmlwdGlvbigiRHVtbXkiKTsNCisJCQlvdXRQb3J0LnNldFR5cGUoU3RyaW5nLmNsYXNzKTsNCisJCQlvdXRQb3J0LnNldFZhbHVlKG5ldyBTdHJpbmcoIkR1bW15IikpOw0KKwkJCXNpbmdsZUZlYXR1cmVVbml0LnNldE91dHB1dFBvcnQob3V0UG9ydCk7DQorCQl9DQorCQkNCisJCXJldHVybiBzaW5nbGVGZWF0dXJlVW5pdDsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXQgY3JlYXRlTXVsdGlGZWF0dXJlVW5pdChNdWx0aUZlYXR1cmVIZWxwZXIgaGVscGVyKSB7DQorCQlNdWx0aUZlYXR1cmVVbml0SW1wbCBtdWx0aUZlYXR1cmVVbml0ID0gbmV3IE11bHRpRmVhdHVyZVVuaXRJbXBsKGhlbHBlcik7DQorCQkNCisJCWlmKG11bHRpRmVhdHVyZVVuaXQuZ2V0SW5wdXRQb3J0KCkgPT0gbnVsbCkgew0KKwkJCVNpbmdsZUlucHV0UG9ydCBpblBvcnQgPSB0aGlzLmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKwkJCWluUG9ydC5zZXROYW1lKCJEdW1teSIpOw0KKwkJCWluUG9ydC5zZXREZXNjcmlwdGlvbigiRHVtbXkiKTsNCisJCQlpblBvcnQuc2V0VHlwZShTdHJpbmcuY2xhc3MpOw0KKwkJCWluUG9ydC5zZXRWYWx1ZShuZXcgU3RyaW5nKCJEdW1teSIpKTsNCisJCQltdWx0aUZlYXR1cmVVbml0LnNldElucHV0UG9ydChpblBvcnQpOw0KKwkJfQ0KKwkJaWYobXVsdGlGZWF0dXJlVW5pdC5nZXRPdXRwdXRQb3J0KCkgPT0gbnVsbCkgew0KKwkJCU11bHRpT3V0cHV0UG9ydCBvdXRQb3J0ID0gdGhpcy5jcmVhdGVNdWx0aU91dHB1dFBvcnQoKTsNCisJCQlvdXRQb3J0LnNldE5hbWUoIkR1bW15Iik7DQorCQkJb3V0UG9ydC5zZXREZXNjcmlwdGlvbigiRHVtbXkiKTsNCisJCQlvdXRQb3J0LnNldFR5cGUoU3RyaW5nLmNsYXNzKTsNCisJCQlvdXRQb3J0LmdldFZhbHVlKCkuYWRkKG5ldyBTdHJpbmcoIkR1bW15IikpOw0KKwkJCW11bHRpRmVhdHVyZVVuaXQuc2V0T3V0cHV0UG9ydChvdXRQb3J0KTsNCisJCX0NCisJCQ0KKwkJcmV0dXJuIG11bHRpRmVhdHVyZVVuaXQ7DQorCX0NCisNCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTaW5nbGVGaWx0ZXJVbml0IGNyZWF0ZVNpbmdsZUZpbHRlclVuaXQoU2luZ2xlRmlsdGVySGVscGVyIGhlbHBlcikgew0KKwkJU2luZ2xlRmlsdGVyVW5pdEltcGwgZmlsdGVyVW5pdCA9IG5ldyBTaW5nbGVGaWx0ZXJVbml0SW1wbChoZWxwZXIpOw0KKwkJDQorCQlpZihmaWx0ZXJVbml0LmdldElucHV0UG9ydCgpID09IG51bGwpIHsNCisJCQlNdWx0aUlucHV0UG9ydCBpblBvcnQgPSB0aGlzLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorCQkJaW5Qb3J0LnNldE5hbWUoIkR1bW15Iik7DQorCQkJaW5Qb3J0LnNldERlc2NyaXB0aW9uKCJEdW1teSIpOw0KKwkJCWluUG9ydC5zZXRUeXBlKFN0cmluZy5jbGFzcyk7DQorCQkJaW5Qb3J0LmdldFZhbHVlKCkuYWRkKG5ldyBTdHJpbmcoIkR1bW15IikpOw0KKwkJCWZpbHRlclVuaXQuc2V0SW5wdXRQb3J0KGluUG9ydCk7DQorCQl9DQorCQlpZihmaWx0ZXJVbml0LmdldE91dHB1dFBvcnQoKSA9PSBudWxsKSB7DQorCQkJU2luZ2xlT3V0cHV0UG9ydCBvdXRQb3J0ID0gdGhpcy5jcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCk7DQorCQkJb3V0UG9ydC5zZXROYW1lKCJEdW1teSIpOw0KKwkJCW91dFBvcnQuc2V0RGVzY3JpcHRpb24oIkR1bW15Iik7DQorCQkJb3V0UG9ydC5zZXRUeXBlKFN0cmluZy5jbGFzcyk7DQorCQkJb3V0UG9ydC5zZXRWYWx1ZShuZXcgU3RyaW5nKCJEdW1teSIpKTsNCisJCQlmaWx0ZXJVbml0LnNldE91dHB1dFBvcnQob3V0UG9ydCk7DQorCQl9DQorCQlyZXR1cm4gZmlsdGVyVW5pdDsNCisJfQ0KKw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE11bHRpRmlsdGVyVW5pdCBjcmVhdGVNdWx0aUZpbHRlclVuaXQoTXVsdGlGaWx0ZXJIZWxwZXIgaGVscGVyKSB7DQorCQlNdWx0aUZpbHRlclVuaXRJbXBsIGZpbHRlclVuaXQgPSBuZXcgTXVsdGlGaWx0ZXJVbml0SW1wbChoZWxwZXIpOw0KKwkJDQorCQlpZihmaWx0ZXJVbml0LmdldElucHV0UG9ydCgpID09IG51bGwpIHsNCisJCQlNdWx0aUlucHV0UG9ydCBpblBvcnQgPSB0aGlzLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorCQkJaW5Qb3J0LnNldE5hbWUoIkR1bW15Iik7DQorCQkJaW5Qb3J0LnNldERlc2NyaXB0aW9uKCJEdW1teSIpOw0KKwkJCWluUG9ydC5zZXRUeXBlKFN0cmluZy5jbGFzcyk7DQorCQkJaW5Qb3J0LmdldFZhbHVlKCkuYWRkKG5ldyBTdHJpbmcoIkR1bW15IikpOw0KKwkJCWZpbHRlclVuaXQuc2V0SW5wdXRQb3J0KGluUG9ydCk7DQorCQl9DQorCQlpZihmaWx0ZXJVbml0LmdldE91dHB1dFBvcnQoKSA9PSBudWxsKSB7DQorCQkJTXVsdGlPdXRwdXRQb3J0IG91dFBvcnQgPSB0aGlzLmNyZWF0ZU11bHRpT3V0cHV0UG9ydCgpOw0KKwkJCW91dFBvcnQuc2V0TmFtZSgiRHVtbXkiKTsNCisJCQlvdXRQb3J0LnNldERlc2NyaXB0aW9uKCJEdW1teSIpOw0KKwkJCW91dFBvcnQuc2V0VHlwZShTdHJpbmcuY2xhc3MpOw0KKwkJCW91dFBvcnQuZ2V0VmFsdWUoKS5hZGQobmV3IFN0cmluZygiRHVtbXkiKSk7DQorCQkJZmlsdGVyVW5pdC5zZXRPdXRwdXRQb3J0KG91dFBvcnQpOw0KKwkJfQ0KKwkJDQorCQlyZXR1cm4gZmlsdGVyVW5pdDsNCisJfQ0KKw0KK30gLy9Db21yZWxGYWN0b3J5SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0NvbXJlbFBhY2thZ2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Db21yZWxQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNWUyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Db21yZWxQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjYxMCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkNvbmRpdGlvbkNoZWNrOw0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uYWxVbml0Ow0KK2ltcG9ydCBjb21yZWwuRGVzY3JpYmVkRWxlbWVudDsNCitpbXBvcnQgY29tcmVsLkZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5GZWF0dXJlVW5pdDsNCitpbXBvcnQgY29tcmVsLkZpbHRlckhlbHBlcjsNCitpbXBvcnQgY29tcmVsLkZpbHRlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTWFwcGluZ1Zpc3VhbGl6YXRpb247DQoraW1wb3J0IGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdDsNCitpbXBvcnQgY29tcmVsLk11bHRpRmlsdGVySGVscGVyOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGaWx0ZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aU91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aVBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aVBvcnRNYXBwaW5nOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLk5hbWVkRWxlbWVudDsNCitpbXBvcnQgY29tcmVsLk91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Qb3J0Ow0KK2ltcG9ydCBjb21yZWwuUG9ydE1hcHBpbmc7DQoraW1wb3J0IGNvbXJlbC5RdWV1ZWRVbml0Ow0KK2ltcG9ydCBjb21yZWwuUmVmYWN0b3JpbmdVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2VxdWVudGlhbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Ud2ljZWRRdWV1ZWRVbml0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+Lg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29tcmVsUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb21yZWxQYWNrYWdlIHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBjb21wb3NpdGVSZWZhY3RvcmluZ0VDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgbmFtZWRFbGVtZW50RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBkZXNjcmliZWRFbGVtZW50RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyByZWZhY3RvcmluZ1VuaXRFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIG1vZGVsUmVmYWN0b3JpbmdFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIGF0b21pY1VuaXRFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIGNvbXBvc2l0ZVVuaXRFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIHNlcXVlbnRpYWxVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBjb25kaXRpb25DaGVja0VDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgY29uZGl0aW9uYWxVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBxdWV1ZWRVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBzaW5nbGVRdWV1ZWRVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyB0d2ljZWRRdWV1ZWRVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBjYXJ0ZXNpYW5RdWV1ZWRVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBwYXJhbGxlbFF1ZXVlZFVuaXRFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIGhlbHBlclVuaXRFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIGZlYXR1cmVVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgbXVsdGlGZWF0dXJlVW5pdEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgZmlsdGVyVW5pdEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgc2luZ2xlRmlsdGVyVW5pdEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgbXVsdGlGaWx0ZXJVbml0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBoZWxwZXJFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIGZlYXR1cmVIZWxwZXJFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIHNpbmdsZUZlYXR1cmVIZWxwZXJFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIG11bHRpRmVhdHVyZUhlbHBlckVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgZmlsdGVySGVscGVyRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBzaW5nbGVGaWx0ZXJIZWxwZXJFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIG11bHRpRmlsdGVySGVscGVyRUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBwb3J0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBzaW5nbGVQb3J0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBtdWx0aVBvcnRFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIGlucHV0UG9ydEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgb3V0cHV0UG9ydEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgc2luZ2xlSW5wdXRQb3J0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBtdWx0aUlucHV0UG9ydEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgc2luZ2xlT3V0cHV0UG9ydEVDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3MgbXVsdGlPdXRwdXRQb3J0RUNsYXNzID0gbnVsbDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIEVDbGFzcyBwb3J0TWFwcGluZ0VDbGFzcyA9IG51bGw7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBFQ2xhc3Mgc2luZ2xlUG9ydE1hcHBpbmdFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIG11bHRpUG9ydE1hcHBpbmdFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUNsYXNzIG11bHRpU2luZ2xlUG9ydE1hcHBpbmdFQ2xhc3MgPSBudWxsOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgRUVudW0gbWFwcGluZ1Zpc3VhbGl6YXRpb25FRW51bSA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoDQorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlDQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLg0KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljDQorCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zDQorCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsDQorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5DQorCSAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UjZU5TX1VSSQ0KKwkgKiBAc2VlICNpbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJpdmF0ZSBDb21yZWxQYWNrYWdlSW1wbCgpIHsNCisJCXN1cGVyKGVOU19VUkksIENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4NCisJICogDQorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgQ29tcmVsUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4NCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2VOU19VUkkNCisJICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkNCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29tcmVsUGFja2FnZSBpbml0KCkgew0KKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbXJlbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tcmVsUGFja2FnZS5lTlNfVVJJKTsNCisNCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UNCisJCUNvbXJlbFBhY2thZ2VJbXBsIHRoZUNvbXJlbFBhY2thZ2UgPSAoQ29tcmVsUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIENvbXJlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IENvbXJlbFBhY2thZ2VJbXBsKCkpOw0KKw0KKwkJaXNJbml0ZWQgPSB0cnVlOw0KKw0KKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMNCisJCXRoZUNvbXJlbFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQorDQorCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhDQorCQl0aGVDb21yZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisNCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQNCisJCXRoZUNvbXJlbFBhY2thZ2UuZnJlZXplKCk7DQorDQorICANCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQ0KKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KENvbXJlbFBhY2thZ2UuZU5TX1VSSSwgdGhlQ29tcmVsUGFja2FnZSk7DQorCQlyZXR1cm4gdGhlQ29tcmVsUGFja2FnZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKSB7DQorCQlyZXR1cm4gY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19NYWluUmVmYWN0b3JpbmdVbml0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbXBvc2l0ZVJlZmFjdG9yaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19Qb3J0TWFwcGluZ3MoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX01vZGVsUmVmYWN0b3JpbmdzKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbXBvc2l0ZVJlZmFjdG9yaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19IZWxwZXIoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX01hcHBpbmdWaXN1YWxpemF0aW9uKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvc2l0ZVJlZmFjdG9yaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19DdXN0b21Jbml0aWFsQ29uZGl0aW9uKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbXBvc2l0ZVJlZmFjdG9yaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19DdXN0b21GaW5hbENvbmRpdGlvbigpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb3NpdGVSZWZhY3RvcmluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXROYW1lZEVsZW1lbnQoKSB7DQorCQlyZXR1cm4gbmFtZWRFbGVtZW50RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldERlc2NyaWJlZEVsZW1lbnQoKSB7DQorCQlyZXR1cm4gZGVzY3JpYmVkRWxlbWVudEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJlZEVsZW1lbnRfRGVzY3JpcHRpb24oKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmVkRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRSZWZhY3RvcmluZ1VuaXQoKSB7DQorCQlyZXR1cm4gcmVmYWN0b3JpbmdVbml0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVmYWN0b3JpbmdVbml0X1NlcUV4ZWN1dGlvbk9yZGVyKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXJlZmFjdG9yaW5nVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRNb2RlbFJlZmFjdG9yaW5nKCkgew0KKwkJcmV0dXJuIG1vZGVsUmVmYWN0b3JpbmdFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2RlbFJlZmFjdG9yaW5nX1JlZklkKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKW1vZGVsUmVmYWN0b3JpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZGVsUmVmYWN0b3JpbmdfTGFiZWwoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kZWxSZWZhY3RvcmluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kZWxSZWZhY3RvcmluZ19OYW1lc3BhY2VVcmkoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbW9kZWxSZWZhY3RvcmluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kZWxSZWZhY3RvcmluZ19JbnB1dFBvcnRzKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKW1vZGVsUmVmYWN0b3JpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0QXRvbWljVW5pdCgpIHsNCisJCXJldHVybiBhdG9taWNVbml0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXRvbWljVW5pdF9JbnB1dFBvcnRzKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKWF0b21pY1VuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEF0b21pY1VuaXRfVW5pdElkKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWF0b21pY1VuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEF0b21pY1VuaXRfTGFiZWwoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXRvbWljVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXRvbWljVW5pdF9OYW1lc3BhY2VVcmkoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXRvbWljVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXRvbWljVW5pdF9UeXBlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWF0b21pY1VuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0b21pY1VuaXRfTW9kZWxSZWZhY3RvcmluZygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlhdG9taWNVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdG9taWNVbml0X0NoZWNrSW5pdGlhbENvbmRpdGlvbkZsYWcoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXRvbWljVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXRvbWljVW5pdF9DaGVja0ZpbmFsQ29uZGl0aW9uRmxhZygpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlhdG9taWNVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldENvbXBvc2l0ZVVuaXQoKSB7DQorCQlyZXR1cm4gY29tcG9zaXRlVW5pdEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0U2VxdWVudGlhbFVuaXQoKSB7DQorCQlyZXR1cm4gc2VxdWVudGlhbFVuaXRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXF1ZW50aWFsVW5pdF9IZWxwZXJVbml0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXF1ZW50aWFsVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXF1ZW50aWFsVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VxdWVudGlhbFVuaXRfSW5wdXRQb3J0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXF1ZW50aWFsVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VxdWVudGlhbFVuaXRfU3RyaWN0KCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlcXVlbnRpYWxVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXF1ZW50aWFsVW5pdF9UeXBlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlcXVlbnRpYWxVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXF1ZW50aWFsVW5pdF9MYmxTdHJpY3QoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VxdWVudGlhbFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uZGl0aW9uQ2hlY2soKSB7DQorCQlyZXR1cm4gY29uZGl0aW9uQ2hlY2tFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25kaXRpb25DaGVja19UeXBlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbmRpdGlvbkNoZWNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25kaXRpb25DaGVja19TcGVjKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbmRpdGlvbkNoZWNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldENvbmRpdGlvbmFsVW5pdCgpIHsNCisJCXJldHVybiBjb25kaXRpb25hbFVuaXRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25kaXRpb25hbFVuaXRfSWYoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29uZGl0aW9uYWxVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25kaXRpb25hbFVuaXRfSGVscGVyVW5pdHMoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29uZGl0aW9uYWxVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25kaXRpb25hbFVuaXRfVGhlbigpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSljb25kaXRpb25hbFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbmRpdGlvbmFsVW5pdF9FbHNlKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbmRpdGlvbmFsVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29uZGl0aW9uYWxVbml0X0lucHV0UG9ydHMoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29uZGl0aW9uYWxVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25kaXRpb25hbFVuaXRfVHlwZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25kaXRpb25hbFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0UXVldWVkVW5pdCgpIHsNCisJCXJldHVybiBxdWV1ZWRVbml0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UXVldWVkVW5pdF9TdHJpY3QoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcXVldWVkVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTaW5nbGVRdWV1ZWRVbml0KCkgew0KKwkJcmV0dXJuIHNpbmdsZVF1ZXVlZFVuaXRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTaW5nbGVRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpbmdsZVF1ZXVlZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNpbmdsZVF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpbmdsZVF1ZXVlZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNpbmdsZVF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVRdWV1ZWRVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpbmdsZVF1ZXVlZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFNpbmdsZVF1ZXVlZFVuaXRfVHlwZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaW5nbGVRdWV1ZWRVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTaW5nbGVRdWV1ZWRVbml0X0xibFN0cmljdCgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaW5nbGVRdWV1ZWRVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFR3aWNlZFF1ZXVlZFVuaXQoKSB7DQorCQlyZXR1cm4gdHdpY2VkUXVldWVkVW5pdEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdCgpIHsNCisJCXJldHVybiBjYXJ0ZXNpYW5RdWV1ZWRVbml0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9IZWxwZXJVbml0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSljYXJ0ZXNpYW5RdWV1ZWRVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSljYXJ0ZXNpYW5RdWV1ZWRVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpY2FydGVzaWFuUXVldWVkVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9NdWx0aUlucHV0UG9ydHMoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpY2FydGVzaWFuUXVldWVkVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9UeXBlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWNhcnRlc2lhblF1ZXVlZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldENhcnRlc2lhblF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKWNhcnRlc2lhblF1ZXVlZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0KCkgew0KKwkJcmV0dXJuIHBhcmFsbGVsUXVldWVkVW5pdEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcmFsbGVsUXVldWVkVW5pdF9IZWxwZXJVbml0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlwYXJhbGxlbFF1ZXVlZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcmFsbGVsUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXRzKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGFyYWxsZWxRdWV1ZWRVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1R5cGUoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGFyYWxsZWxRdWV1ZWRVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfTGJsU3RyaWN0KCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKXBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRIZWxwZXJVbml0KCkgew0KKwkJcmV0dXJuIGhlbHBlclVuaXRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIZWxwZXJVbml0X0hlbHBlclVuaXRJZCgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSloZWxwZXJVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIZWxwZXJVbml0X05hbWVzcGFjZVVyaSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSloZWxwZXJVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEZlYXR1cmVVbml0KCkgew0KKwkJcmV0dXJuIGZlYXR1cmVVbml0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTaW5nbGVGZWF0dXJlVW5pdCgpIHsNCisJCXJldHVybiBzaW5nbGVGZWF0dXJlVW5pdEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNpbmdsZUZlYXR1cmVVbml0X0lucHV0UG9ydCgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2luZ2xlRmVhdHVyZVVuaXRfU2Vjb25kYXJ5SW5wdXRQb3J0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2luZ2xlRmVhdHVyZVVuaXRfT3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2luZ2xlRmVhdHVyZVVuaXRfU2luZ2xlRmVhdHVyZUhlbHBlcigpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2luZ2xlRmVhdHVyZVVuaXRfVHlwZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRNdWx0aUZlYXR1cmVVbml0KCkgew0KKwkJcmV0dXJuIG11bHRpRmVhdHVyZVVuaXRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aUZlYXR1cmVVbml0X0lucHV0UG9ydCgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSltdWx0aUZlYXR1cmVVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aUZlYXR1cmVVbml0X1NlY29uZGFyeUlucHV0UG9ydHMoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpbXVsdGlGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TXVsdGlGZWF0dXJlVW5pdF9PdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpRmVhdHVyZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldE11bHRpRmVhdHVyZVVuaXRfTXVsdGlGZWF0dXJlSGVscGVyKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpRmVhdHVyZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldE11bHRpRmVhdHVyZVVuaXRfVHlwZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSltdWx0aUZlYXR1cmVVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEZpbHRlclVuaXQoKSB7DQorCQlyZXR1cm4gZmlsdGVyVW5pdEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0U2luZ2xlRmlsdGVyVW5pdCgpIHsNCisJCXJldHVybiBzaW5nbGVGaWx0ZXJVbml0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2luZ2xlRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2luZ2xlRmlsdGVyVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2luZ2xlRmlsdGVyVW5pdF9PdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpbmdsZUZpbHRlclVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNpbmdsZUZpbHRlclVuaXRfU2luZ2xlRmlsdGVySGVscGVyKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpbmdsZUZpbHRlclVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFNpbmdsZUZpbHRlclVuaXRfVHlwZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlzaW5nbGVGaWx0ZXJVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldE11bHRpRmlsdGVyVW5pdCgpIHsNCisJCXJldHVybiBtdWx0aUZpbHRlclVuaXRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aUZpbHRlclVuaXRfSW5wdXRQb3J0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpRmlsdGVyVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TXVsdGlGaWx0ZXJVbml0X091dHB1dFBvcnQoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpbXVsdGlGaWx0ZXJVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aUZpbHRlclVuaXRfTXVsdGlGaWx0ZXJIZWxwZXIoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpbXVsdGlGaWx0ZXJVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNdWx0aUZpbHRlclVuaXRfVHlwZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSltdWx0aUZpbHRlclVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0SGVscGVyKCkgew0KKwkJcmV0dXJuIGhlbHBlckVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEhlbHBlcl9IZWxwZXJJZCgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSloZWxwZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldEhlbHBlcl9OYW1lc3BhY2VVcmkoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaGVscGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldEZlYXR1cmVIZWxwZXIoKSB7DQorCQlyZXR1cm4gZmVhdHVyZUhlbHBlckVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZlYXR1cmVIZWxwZXJfSW5wdXRQb3J0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKWZlYXR1cmVIZWxwZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZlYXR1cmVIZWxwZXJfU2Vjb25kYXJ5SW5wdXRQb3J0cygpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlmZWF0dXJlSGVscGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFNpbmdsZUZlYXR1cmVIZWxwZXIoKSB7DQorCQlyZXR1cm4gc2luZ2xlRmVhdHVyZUhlbHBlckVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNpbmdsZUZlYXR1cmVIZWxwZXJfT3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVGZWF0dXJlSGVscGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldE11bHRpRmVhdHVyZUhlbHBlcigpIHsNCisJCXJldHVybiBtdWx0aUZlYXR1cmVIZWxwZXJFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aUZlYXR1cmVIZWxwZXJfT3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSltdWx0aUZlYXR1cmVIZWxwZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0RmlsdGVySGVscGVyKCkgew0KKwkJcmV0dXJuIGZpbHRlckhlbHBlckVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpbHRlckhlbHBlcl9JbnB1dFBvcnQoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmlsdGVySGVscGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFNpbmdsZUZpbHRlckhlbHBlcigpIHsNCisJCXJldHVybiBzaW5nbGVGaWx0ZXJIZWxwZXJFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTaW5nbGVGaWx0ZXJIZWxwZXJfT3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVGaWx0ZXJIZWxwZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoKSB7DQorCQlyZXR1cm4gbXVsdGlGaWx0ZXJIZWxwZXJFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNdWx0aUZpbHRlckhlbHBlcl9PdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpRmlsdGVySGVscGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFBvcnQoKSB7DQorCQlyZXR1cm4gcG9ydEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRfVHlwZSgpIHsNCisJCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFNpbmdsZVBvcnQoKSB7DQorCQlyZXR1cm4gc2luZ2xlUG9ydEVDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQXR0cmlidXRlIGdldFNpbmdsZVBvcnRfVmFsdWUoKSB7DQorCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2luZ2xlUG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRNdWx0aVBvcnQoKSB7DQorCQlyZXR1cm4gbXVsdGlQb3J0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TXVsdGlQb3J0X1ZhbHVlKCkgew0KKwkJcmV0dXJuIChFQXR0cmlidXRlKW11bHRpUG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRJbnB1dFBvcnQoKSB7DQorCQlyZXR1cm4gaW5wdXRQb3J0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRPdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIG91dHB1dFBvcnRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFNpbmdsZUlucHV0UG9ydCgpIHsNCisJCXJldHVybiBzaW5nbGVJbnB1dFBvcnRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldE11bHRpSW5wdXRQb3J0KCkgew0KKwkJcmV0dXJuIG11bHRpSW5wdXRQb3J0RUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTaW5nbGVPdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIHNpbmdsZU91dHB1dFBvcnRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldE11bHRpT3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiBtdWx0aU91dHB1dFBvcnRFQ2xhc3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldFBvcnRNYXBwaW5nKCkgew0KKwkJcmV0dXJuIHBvcnRNYXBwaW5nRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVDbGFzcyBnZXRTaW5nbGVQb3J0TWFwcGluZygpIHsNCisJCXJldHVybiBzaW5nbGVQb3J0TWFwcGluZ0VDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNpbmdsZVBvcnRNYXBwaW5nX1NvdXJjZSgpIHsNCisJCXJldHVybiAoRVJlZmVyZW5jZSlzaW5nbGVQb3J0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2luZ2xlUG9ydE1hcHBpbmdfVGFyZ2V0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNpbmdsZVBvcnRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUNsYXNzIGdldE11bHRpUG9ydE1hcHBpbmcoKSB7DQorCQlyZXR1cm4gbXVsdGlQb3J0TWFwcGluZ0VDbGFzczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldE11bHRpUG9ydE1hcHBpbmdfU291cmNlKCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpUG9ydE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFUmVmZXJlbmNlIGdldE11bHRpUG9ydE1hcHBpbmdfVGFyZ2V0KCkgew0KKwkJcmV0dXJuIChFUmVmZXJlbmNlKW11bHRpUG9ydE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFQ2xhc3MgZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZygpIHsNCisJCXJldHVybiBtdWx0aVNpbmdsZVBvcnRNYXBwaW5nRUNsYXNzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZ19Tb3VyY2UoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpbXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TXVsdGlTaW5nbGVQb3J0TWFwcGluZ19UYXJnZXQoKSB7DQorCQlyZXR1cm4gKEVSZWZlcmVuY2UpbXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVFbnVtIGdldE1hcHBpbmdWaXN1YWxpemF0aW9uKCkgew0KKwkJcmV0dXJuIG1hcHBpbmdWaXN1YWxpemF0aW9uRUVudW07DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcmVsRmFjdG9yeSBnZXRDb21yZWxGYWN0b3J5KCkgew0KKwkJcmV0dXJuIChDb21yZWxGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQorCQlpc0NyZWF0ZWQgPSB0cnVlOw0KKw0KKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQorCQljb21wb3NpdGVSZWZhY3RvcmluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QT1NJVEVfUkVGQUNUT1JJTkcpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShjb21wb3NpdGVSZWZhY3RvcmluZ0VDbGFzcywgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19NQUlOX1JFRkFDVE9SSU5HX1VOSVQpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShjb21wb3NpdGVSZWZhY3RvcmluZ0VDbGFzcywgQ09NUE9TSVRFX1JFRkFDVE9SSU5HX19QT1JUX01BUFBJTkdTKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MsIENPTVBPU0lURV9SRUZBQ1RPUklOR19fTU9ERUxfUkVGQUNUT1JJTkdTKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MsIENPTVBPU0lURV9SRUZBQ1RPUklOR19fSEVMUEVSKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MsIENPTVBPU0lURV9SRUZBQ1RPUklOR19fTUFQUElOR19WSVNVQUxJWkFUSU9OKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MsIENPTVBPU0lURV9SRUZBQ1RPUklOR19fQ1VTVE9NX0lOSVRJQUxfQ09ORElUSU9OKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MsIENPTVBPU0lURV9SRUZBQ1RPUklOR19fQ1VTVE9NX0ZJTkFMX0NPTkRJVElPTik7DQorDQorCQluYW1lZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfRUxFTUVOVCk7DQorCQljcmVhdGVFQXR0cmlidXRlKG5hbWVkRWxlbWVudEVDbGFzcywgTkFNRURfRUxFTUVOVF9fTkFNRSk7DQorDQorCQlkZXNjcmliZWRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSUJFRF9FTEVNRU5UKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmVkRWxlbWVudEVDbGFzcywgREVTQ1JJQkVEX0VMRU1FTlRfX0RFU0NSSVBUSU9OKTsNCisNCisJCXJlZmFjdG9yaW5nVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUZBQ1RPUklOR19VTklUKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUocmVmYWN0b3JpbmdVbml0RUNsYXNzLCBSRUZBQ1RPUklOR19VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSKTsNCisNCisJCW1vZGVsUmVmYWN0b3JpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTU9ERUxfUkVGQUNUT1JJTkcpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShtb2RlbFJlZmFjdG9yaW5nRUNsYXNzLCBNT0RFTF9SRUZBQ1RPUklOR19fUkVGX0lEKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUobW9kZWxSZWZhY3RvcmluZ0VDbGFzcywgTU9ERUxfUkVGQUNUT1JJTkdfX0xBQkVMKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUobW9kZWxSZWZhY3RvcmluZ0VDbGFzcywgTU9ERUxfUkVGQUNUT1JJTkdfX05BTUVTUEFDRV9VUkkpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShtb2RlbFJlZmFjdG9yaW5nRUNsYXNzLCBNT0RFTF9SRUZBQ1RPUklOR19fSU5QVVRfUE9SVFMpOw0KKw0KKwkJYXRvbWljVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVE9NSUNfVU5JVCk7DQorCQljcmVhdGVFUmVmZXJlbmNlKGF0b21pY1VuaXRFQ2xhc3MsIEFUT01JQ19VTklUX19JTlBVVF9QT1JUUyk7DQorCQljcmVhdGVFQXR0cmlidXRlKGF0b21pY1VuaXRFQ2xhc3MsIEFUT01JQ19VTklUX19VTklUX0lEKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXRvbWljVW5pdEVDbGFzcywgQVRPTUlDX1VOSVRfX0xBQkVMKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXRvbWljVW5pdEVDbGFzcywgQVRPTUlDX1VOSVRfX05BTUVTUEFDRV9VUkkpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShhdG9taWNVbml0RUNsYXNzLCBBVE9NSUNfVU5JVF9fVFlQRSk7DQorCQljcmVhdGVFUmVmZXJlbmNlKGF0b21pY1VuaXRFQ2xhc3MsIEFUT01JQ19VTklUX19NT0RFTF9SRUZBQ1RPUklORyk7DQorCQljcmVhdGVFQXR0cmlidXRlKGF0b21pY1VuaXRFQ2xhc3MsIEFUT01JQ19VTklUX19DSEVDS19JTklUSUFMX0NPTkRJVElPTl9GTEFHKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXRvbWljVW5pdEVDbGFzcywgQVRPTUlDX1VOSVRfX0NIRUNLX0ZJTkFMX0NPTkRJVElPTl9GTEFHKTsNCisNCisJCWNvbXBvc2l0ZVVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9TSVRFX1VOSVQpOw0KKw0KKwkJc2VxdWVudGlhbFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VRVUVOVElBTF9VTklUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VxdWVudGlhbFVuaXRFQ2xhc3MsIFNFUVVFTlRJQUxfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VxdWVudGlhbFVuaXRFQ2xhc3MsIFNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShzZXF1ZW50aWFsVW5pdEVDbGFzcywgU0VRVUVOVElBTF9VTklUX19JTlBVVF9QT1JUUyk7DQorCQljcmVhdGVFQXR0cmlidXRlKHNlcXVlbnRpYWxVbml0RUNsYXNzLCBTRVFVRU5USUFMX1VOSVRfX1NUUklDVCk7DQorCQljcmVhdGVFQXR0cmlidXRlKHNlcXVlbnRpYWxVbml0RUNsYXNzLCBTRVFVRU5USUFMX1VOSVRfX1RZUEUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXF1ZW50aWFsVW5pdEVDbGFzcywgU0VRVUVOVElBTF9VTklUX19MQkxfU1RSSUNUKTsNCisNCisJCWNvbmRpdGlvbkNoZWNrRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTkRJVElPTl9DSEVDSyk7DQorCQljcmVhdGVFQXR0cmlidXRlKGNvbmRpdGlvbkNoZWNrRUNsYXNzLCBDT05ESVRJT05fQ0hFQ0tfX1RZUEUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25kaXRpb25DaGVja0VDbGFzcywgQ09ORElUSU9OX0NIRUNLX19TUEVDKTsNCisNCisJCWNvbmRpdGlvbmFsVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05ESVRJT05BTF9VTklUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoY29uZGl0aW9uYWxVbml0RUNsYXNzLCBDT05ESVRJT05BTF9VTklUX19JRik7DQorCQljcmVhdGVFUmVmZXJlbmNlKGNvbmRpdGlvbmFsVW5pdEVDbGFzcywgQ09ORElUSU9OQUxfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoY29uZGl0aW9uYWxVbml0RUNsYXNzLCBDT05ESVRJT05BTF9VTklUX19USEVOKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoY29uZGl0aW9uYWxVbml0RUNsYXNzLCBDT05ESVRJT05BTF9VTklUX19FTFNFKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoY29uZGl0aW9uYWxVbml0RUNsYXNzLCBDT05ESVRJT05BTF9VTklUX19JTlBVVF9QT1JUUyk7DQorCQljcmVhdGVFQXR0cmlidXRlKGNvbmRpdGlvbmFsVW5pdEVDbGFzcywgQ09ORElUSU9OQUxfVU5JVF9fVFlQRSk7DQorDQorCQlxdWV1ZWRVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFFVRVVFRF9VTklUKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUocXVldWVkVW5pdEVDbGFzcywgUVVFVUVEX1VOSVRfX1NUUklDVCk7DQorDQorCQlzaW5nbGVRdWV1ZWRVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJTkdMRV9RVUVVRURfVU5JVCk7DQorCQljcmVhdGVFUmVmZXJlbmNlKHNpbmdsZVF1ZXVlZFVuaXRFQ2xhc3MsIFNJTkdMRV9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlUXVldWVkVW5pdEVDbGFzcywgU0lOR0xFX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlUXVldWVkVW5pdEVDbGFzcywgU0lOR0xFX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFMpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShzaW5nbGVRdWV1ZWRVbml0RUNsYXNzLCBTSU5HTEVfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlQpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzaW5nbGVRdWV1ZWRVbml0RUNsYXNzLCBTSU5HTEVfUVVFVUVEX1VOSVRfX1RZUEUpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzaW5nbGVRdWV1ZWRVbml0RUNsYXNzLCBTSU5HTEVfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QpOw0KKw0KKwkJdHdpY2VkUXVldWVkVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUV0lDRURfUVVFVUVEX1VOSVQpOw0KKw0KKwkJY2FydGVzaWFuUXVldWVkVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDQVJURVNJQU5fUVVFVUVEX1VOSVQpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShjYXJ0ZXNpYW5RdWV1ZWRVbml0RUNsYXNzLCBDQVJURVNJQU5fUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUyk7DQorCQljcmVhdGVFUmVmZXJlbmNlKGNhcnRlc2lhblF1ZXVlZFVuaXRFQ2xhc3MsIENBUlRFU0lBTl9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCk7DQorCQljcmVhdGVFUmVmZXJlbmNlKGNhcnRlc2lhblF1ZXVlZFVuaXRFQ2xhc3MsIENBUlRFU0lBTl9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoY2FydGVzaWFuUXVldWVkVW5pdEVDbGFzcywgQ0FSVEVTSUFOX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUyk7DQorCQljcmVhdGVFQXR0cmlidXRlKGNhcnRlc2lhblF1ZXVlZFVuaXRFQ2xhc3MsIENBUlRFU0lBTl9RVUVVRURfVU5JVF9fVFlQRSk7DQorCQljcmVhdGVFQXR0cmlidXRlKGNhcnRlc2lhblF1ZXVlZFVuaXRFQ2xhc3MsIENBUlRFU0lBTl9RVUVVRURfVU5JVF9fTEJMX1NUUklDVCk7DQorDQorCQlwYXJhbGxlbFF1ZXVlZFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFSQUxMRUxfUVVFVUVEX1VOSVQpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShwYXJhbGxlbFF1ZXVlZFVuaXRFQ2xhc3MsIFBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFMpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShwYXJhbGxlbFF1ZXVlZFVuaXRFQ2xhc3MsIFBBUkFMTEVMX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUUyk7DQorCQljcmVhdGVFUmVmZXJlbmNlKHBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcywgUEFSQUxMRUxfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUyk7DQorCQljcmVhdGVFUmVmZXJlbmNlKHBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcywgUEFSQUxMRUxfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlRTKTsNCisJCWNyZWF0ZUVBdHRyaWJ1dGUocGFyYWxsZWxRdWV1ZWRVbml0RUNsYXNzLCBQQVJBTExFTF9RVUVVRURfVU5JVF9fVFlQRSk7DQorCQljcmVhdGVFQXR0cmlidXRlKHBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcywgUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QpOw0KKw0KKwkJaGVscGVyVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIRUxQRVJfVU5JVCk7DQorCQljcmVhdGVFQXR0cmlidXRlKGhlbHBlclVuaXRFQ2xhc3MsIEhFTFBFUl9VTklUX19IRUxQRVJfVU5JVF9JRCk7DQorCQljcmVhdGVFQXR0cmlidXRlKGhlbHBlclVuaXRFQ2xhc3MsIEhFTFBFUl9VTklUX19OQU1FU1BBQ0VfVVJJKTsNCisNCisJCWZlYXR1cmVVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEZFQVRVUkVfVU5JVCk7DQorDQorCQlzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTSU5HTEVfRkVBVFVSRV9VTklUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlRmVhdHVyZVVuaXRFQ2xhc3MsIFNJTkdMRV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcywgU0lOR0xFX0ZFQVRVUkVfVU5JVF9fU0VDT05EQVJZX0lOUFVUX1BPUlRTKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlRmVhdHVyZVVuaXRFQ2xhc3MsIFNJTkdMRV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlRmVhdHVyZVVuaXRFQ2xhc3MsIFNJTkdMRV9GRUFUVVJFX1VOSVRfX1NJTkdMRV9GRUFUVVJFX0hFTFBFUik7DQorCQljcmVhdGVFQXR0cmlidXRlKHNpbmdsZUZlYXR1cmVVbml0RUNsYXNzLCBTSU5HTEVfRkVBVFVSRV9VTklUX19UWVBFKTsNCisNCisJCW11bHRpRmVhdHVyZVVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTVVMVElfRkVBVFVSRV9VTklUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlGZWF0dXJlVW5pdEVDbGFzcywgTVVMVElfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlGZWF0dXJlVW5pdEVDbGFzcywgTVVMVElfRkVBVFVSRV9VTklUX19TRUNPTkRBUllfSU5QVVRfUE9SVFMpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShtdWx0aUZlYXR1cmVVbml0RUNsYXNzLCBNVUxUSV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlGZWF0dXJlVW5pdEVDbGFzcywgTVVMVElfRkVBVFVSRV9VTklUX19NVUxUSV9GRUFUVVJFX0hFTFBFUik7DQorCQljcmVhdGVFQXR0cmlidXRlKG11bHRpRmVhdHVyZVVuaXRFQ2xhc3MsIE1VTFRJX0ZFQVRVUkVfVU5JVF9fVFlQRSk7DQorDQorCQlmaWx0ZXJVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEZJTFRFUl9VTklUKTsNCisNCisJCXNpbmdsZUZpbHRlclVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lOR0xFX0ZJTFRFUl9VTklUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlRmlsdGVyVW5pdEVDbGFzcywgU0lOR0xFX0ZJTFRFUl9VTklUX19JTlBVVF9QT1JUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlRmlsdGVyVW5pdEVDbGFzcywgU0lOR0xFX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVCk7DQorCQljcmVhdGVFUmVmZXJlbmNlKHNpbmdsZUZpbHRlclVuaXRFQ2xhc3MsIFNJTkdMRV9GSUxURVJfVU5JVF9fU0lOR0xFX0ZJTFRFUl9IRUxQRVIpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShzaW5nbGVGaWx0ZXJVbml0RUNsYXNzLCBTSU5HTEVfRklMVEVSX1VOSVRfX1RZUEUpOw0KKw0KKwkJbXVsdGlGaWx0ZXJVbml0RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1VTFRJX0ZJTFRFUl9VTklUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlGaWx0ZXJVbml0RUNsYXNzLCBNVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVCk7DQorCQljcmVhdGVFUmVmZXJlbmNlKG11bHRpRmlsdGVyVW5pdEVDbGFzcywgTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlGaWx0ZXJVbml0RUNsYXNzLCBNVUxUSV9GSUxURVJfVU5JVF9fTVVMVElfRklMVEVSX0hFTFBFUik7DQorCQljcmVhdGVFQXR0cmlidXRlKG11bHRpRmlsdGVyVW5pdEVDbGFzcywgTVVMVElfRklMVEVSX1VOSVRfX1RZUEUpOw0KKw0KKwkJaGVscGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEhFTFBFUik7DQorCQljcmVhdGVFQXR0cmlidXRlKGhlbHBlckVDbGFzcywgSEVMUEVSX19IRUxQRVJfSUQpOw0KKwkJY3JlYXRlRUF0dHJpYnV0ZShoZWxwZXJFQ2xhc3MsIEhFTFBFUl9fTkFNRVNQQUNFX1VSSSk7DQorDQorCQlmZWF0dXJlSGVscGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEZFQVRVUkVfSEVMUEVSKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UoZmVhdHVyZUhlbHBlckVDbGFzcywgRkVBVFVSRV9IRUxQRVJfX0lOUFVUX1BPUlQpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShmZWF0dXJlSGVscGVyRUNsYXNzLCBGRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTKTsNCisNCisJCXNpbmdsZUZlYXR1cmVIZWxwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lOR0xFX0ZFQVRVUkVfSEVMUEVSKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlRmVhdHVyZUhlbHBlckVDbGFzcywgU0lOR0xFX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVCk7DQorDQorCQltdWx0aUZlYXR1cmVIZWxwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTVVMVElfRkVBVFVSRV9IRUxQRVIpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShtdWx0aUZlYXR1cmVIZWxwZXJFQ2xhc3MsIE1VTFRJX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVCk7DQorDQorCQlmaWx0ZXJIZWxwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklMVEVSX0hFTFBFUik7DQorCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckhlbHBlckVDbGFzcywgRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVCk7DQorDQorCQlzaW5nbGVGaWx0ZXJIZWxwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lOR0xFX0ZJTFRFUl9IRUxQRVIpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShzaW5nbGVGaWx0ZXJIZWxwZXJFQ2xhc3MsIFNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCk7DQorDQorCQltdWx0aUZpbHRlckhlbHBlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNVUxUSV9GSUxURVJfSEVMUEVSKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlGaWx0ZXJIZWxwZXJFQ2xhc3MsIE1VTFRJX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JUKTsNCisNCisJCXBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVCk7DQorCQljcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX1RZUEUpOw0KKw0KKwkJc2luZ2xlUG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTSU5HTEVfUE9SVCk7DQorCQljcmVhdGVFQXR0cmlidXRlKHNpbmdsZVBvcnRFQ2xhc3MsIFNJTkdMRV9QT1JUX19WQUxVRSk7DQorDQorCQltdWx0aVBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTVVMVElfUE9SVCk7DQorCQljcmVhdGVFQXR0cmlidXRlKG11bHRpUG9ydEVDbGFzcywgTVVMVElfUE9SVF9fVkFMVUUpOw0KKw0KKwkJaW5wdXRQb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElOUFVUX1BPUlQpOw0KKw0KKwkJb3V0cHV0UG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPVVRQVVRfUE9SVCk7DQorDQorCQlzaW5nbGVJbnB1dFBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lOR0xFX0lOUFVUX1BPUlQpOw0KKw0KKwkJbXVsdGlJbnB1dFBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTVVMVElfSU5QVVRfUE9SVCk7DQorDQorCQlzaW5nbGVPdXRwdXRQb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJTkdMRV9PVVRQVVRfUE9SVCk7DQorDQorCQltdWx0aU91dHB1dFBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTVVMVElfT1VUUFVUX1BPUlQpOw0KKw0KKwkJcG9ydE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVF9NQVBQSU5HKTsNCisNCisJCXNpbmdsZVBvcnRNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNJTkdMRV9QT1JUX01BUFBJTkcpOw0KKwkJY3JlYXRlRVJlZmVyZW5jZShzaW5nbGVQb3J0TWFwcGluZ0VDbGFzcywgU0lOR0xFX1BPUlRfTUFQUElOR19fU09VUkNFKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2luZ2xlUG9ydE1hcHBpbmdFQ2xhc3MsIFNJTkdMRV9QT1JUX01BUFBJTkdfX1RBUkdFVCk7DQorDQorCQltdWx0aVBvcnRNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1VTFRJX1BPUlRfTUFQUElORyk7DQorCQljcmVhdGVFUmVmZXJlbmNlKG11bHRpUG9ydE1hcHBpbmdFQ2xhc3MsIE1VTFRJX1BPUlRfTUFQUElOR19fU09VUkNFKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlQb3J0TWFwcGluZ0VDbGFzcywgTVVMVElfUE9SVF9NQVBQSU5HX19UQVJHRVQpOw0KKw0KKwkJbXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNVUxUSV9TSU5HTEVfUE9SVF9NQVBQSU5HKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VDbGFzcywgTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fU09VUkNFKTsNCisJCWNyZWF0ZUVSZWZlcmVuY2UobXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VDbGFzcywgTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VUKTsNCisNCisJCS8vIENyZWF0ZSBlbnVtcw0KKwkJbWFwcGluZ1Zpc3VhbGl6YXRpb25FRW51bSA9IGNyZWF0ZUVFbnVtKE1BUFBJTkdfVklTVUFMSVpBVElPTik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KKw0KKwkvKioNCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMNCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7DQorCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOw0KKwkJaXNJbml0aWFsaXplZCA9IHRydWU7DQorDQorCQkvLyBJbml0aWFsaXplIHBhY2thZ2UNCisJCXNldE5hbWUoZU5BTUUpOw0KKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7DQorCQlzZXROc1VSSShlTlNfVVJJKTsNCisNCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMNCisNCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycw0KKw0KKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3Nlcw0KKwkJY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2RlbFJlZmFjdG9yaW5nKCkpOw0KKwkJcmVmYWN0b3JpbmdVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOw0KKwkJbW9kZWxSZWZhY3RvcmluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsNCisJCW1vZGVsUmVmYWN0b3JpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliZWRFbGVtZW50KCkpOw0KKwkJYXRvbWljVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJlZmFjdG9yaW5nVW5pdCgpKTsNCisJCWNvbXBvc2l0ZVVuaXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSZWZhY3RvcmluZ1VuaXQoKSk7DQorCQlzZXF1ZW50aWFsVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbXBvc2l0ZVVuaXQoKSk7DQorCQljb25kaXRpb25DaGVja0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsNCisJCWNvbmRpdGlvbkNoZWNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmVkRWxlbWVudCgpKTsNCisJCWNvbmRpdGlvbmFsVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbXBvc2l0ZVVuaXQoKSk7DQorCQlxdWV1ZWRVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcG9zaXRlVW5pdCgpKTsNCisJCXNpbmdsZVF1ZXVlZFVuaXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRRdWV1ZWRVbml0KCkpOw0KKwkJdHdpY2VkUXVldWVkVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFF1ZXVlZFVuaXQoKSk7DQorCQljYXJ0ZXNpYW5RdWV1ZWRVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VHdpY2VkUXVldWVkVW5pdCgpKTsNCisJCXBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFR3aWNlZFF1ZXVlZFVuaXQoKSk7DQorCQloZWxwZXJVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOw0KKwkJaGVscGVyVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaWJlZEVsZW1lbnQoKSk7DQorCQlmZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEhlbHBlclVuaXQoKSk7DQorCQlzaW5nbGVGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVVbml0KCkpOw0KKwkJbXVsdGlGZWF0dXJlVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZlYXR1cmVVbml0KCkpOw0KKwkJZmlsdGVyVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEhlbHBlclVuaXQoKSk7DQorCQlzaW5nbGVGaWx0ZXJVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmlsdGVyVW5pdCgpKTsNCisJCW11bHRpRmlsdGVyVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZpbHRlclVuaXQoKSk7DQorCQloZWxwZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZEVsZW1lbnQoKSk7DQorCQloZWxwZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliZWRFbGVtZW50KCkpOw0KKwkJZmVhdHVyZUhlbHBlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEhlbHBlcigpKTsNCisJCXNpbmdsZUZlYXR1cmVIZWxwZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGZWF0dXJlSGVscGVyKCkpOw0KKwkJbXVsdGlGZWF0dXJlSGVscGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmVhdHVyZUhlbHBlcigpKTsNCisJCWZpbHRlckhlbHBlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEhlbHBlcigpKTsNCisJCXNpbmdsZUZpbHRlckhlbHBlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZpbHRlckhlbHBlcigpKTsNCisJCW11bHRpRmlsdGVySGVscGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmlsdGVySGVscGVyKCkpOw0KKwkJcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsNCisJCXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliZWRFbGVtZW50KCkpOw0KKwkJc2luZ2xlUG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBvcnQoKSk7DQorCQltdWx0aVBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQb3J0KCkpOw0KKwkJaW5wdXRQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UG9ydCgpKTsNCisJCW91dHB1dFBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQb3J0KCkpOw0KKwkJc2luZ2xlSW5wdXRQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2luZ2xlUG9ydCgpKTsNCisJCXNpbmdsZUlucHV0UG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElucHV0UG9ydCgpKTsNCisJCW11bHRpSW5wdXRQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TXVsdGlQb3J0KCkpOw0KKwkJbXVsdGlJbnB1dFBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJbnB1dFBvcnQoKSk7DQorCQlzaW5nbGVPdXRwdXRQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2luZ2xlUG9ydCgpKTsNCisJCXNpbmdsZU91dHB1dFBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRPdXRwdXRQb3J0KCkpOw0KKwkJbXVsdGlPdXRwdXRQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TXVsdGlQb3J0KCkpOw0KKwkJbXVsdGlPdXRwdXRQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0T3V0cHV0UG9ydCgpKTsNCisJCXNpbmdsZVBvcnRNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UG9ydE1hcHBpbmcoKSk7DQorCQltdWx0aVBvcnRNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UG9ydE1hcHBpbmcoKSk7DQorCQltdWx0aVNpbmdsZVBvcnRNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UG9ydE1hcHBpbmcoKSk7DQorDQorCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycw0KKwkJaW5pdEVDbGFzcyhjb21wb3NpdGVSZWZhY3RvcmluZ0VDbGFzcywgQ29tcG9zaXRlUmVmYWN0b3JpbmcuY2xhc3MsICJDb21wb3NpdGVSZWZhY3RvcmluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX01haW5SZWZhY3RvcmluZ1VuaXQoKSwgdGhpcy5nZXRSZWZhY3RvcmluZ1VuaXQoKSwgbnVsbCwgIm1haW5SZWZhY3RvcmluZ1VuaXQiLCBudWxsLCAxLCAxLCBDb21wb3NpdGVSZWZhY3RvcmluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldENvbXBvc2l0ZVJlZmFjdG9yaW5nX1BvcnRNYXBwaW5ncygpLCB0aGlzLmdldFBvcnRNYXBwaW5nKCksIG51bGwsICJwb3J0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUmVmYWN0b3JpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19Nb2RlbFJlZmFjdG9yaW5ncygpLCB0aGlzLmdldE1vZGVsUmVmYWN0b3JpbmcoKSwgbnVsbCwgIm1vZGVsUmVmYWN0b3JpbmdzIiwgbnVsbCwgMCwgLTEsIENvbXBvc2l0ZVJlZmFjdG9yaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmdfSGVscGVyKCksIHRoaXMuZ2V0SGVscGVyKCksIG51bGwsICJoZWxwZXIiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUmVmYWN0b3JpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19NYXBwaW5nVmlzdWFsaXphdGlvbigpLCB0aGlzLmdldE1hcHBpbmdWaXN1YWxpemF0aW9uKCksICJtYXBwaW5nVmlzdWFsaXphdGlvbiIsICIwIiwgMSwgMSwgQ29tcG9zaXRlUmVmYWN0b3JpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19DdXN0b21Jbml0aWFsQ29uZGl0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjdXN0b21Jbml0aWFsQ29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgQ29tcG9zaXRlUmVmYWN0b3JpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wb3NpdGVSZWZhY3RvcmluZ19DdXN0b21GaW5hbENvbmRpdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY3VzdG9tRmluYWxDb25kaXRpb24iLCBudWxsLCAwLCAxLCBDb21wb3NpdGVSZWZhY3RvcmluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MobmFtZWRFbGVtZW50RUNsYXNzLCBOYW1lZEVsZW1lbnQuY2xhc3MsICJOYW1lZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBOYW1lZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKGRlc2NyaWJlZEVsZW1lbnRFQ2xhc3MsIERlc2NyaWJlZEVsZW1lbnQuY2xhc3MsICJEZXNjcmliZWRFbGVtZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldERlc2NyaWJlZEVsZW1lbnRfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmVkRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MocmVmYWN0b3JpbmdVbml0RUNsYXNzLCBSZWZhY3RvcmluZ1VuaXQuY2xhc3MsICJSZWZhY3RvcmluZ1VuaXQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFJlZmFjdG9yaW5nVW5pdF9TZXFFeGVjdXRpb25PcmRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAic2VxRXhlY3V0aW9uT3JkZXIiLCBudWxsLCAwLCAxLCBSZWZhY3RvcmluZ1VuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlhZGRFT3BlcmF0aW9uKHJlZmFjdG9yaW5nVW5pdEVDbGFzcywgdGhpcy5nZXRJbnB1dFBvcnQoKSwgImdldEFsbElucHV0UG9ydHMiLCAwLCAtMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsNCisNCisJCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKHJlZmFjdG9yaW5nVW5pdEVDbGFzcywgbnVsbCwgInNldFNlcUV4ZWN1dGlvbk9yZGVyIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsNCisJCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJzZXFFeGVjdXRpb25PcmRlciIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN1cGVyQ2FsbCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlvcCA9IGFkZEVPcGVyYXRpb24ocmVmYWN0b3JpbmdVbml0RUNsYXNzLCBudWxsLCAic2V0TmFtZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmV3TmFtZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVwZGF0ZUNvbnRhaW5lciIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKG1vZGVsUmVmYWN0b3JpbmdFQ2xhc3MsIE1vZGVsUmVmYWN0b3JpbmcuY2xhc3MsICJNb2RlbFJlZmFjdG9yaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kZWxSZWZhY3RvcmluZ19SZWZJZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVmSWQiLCBudWxsLCAxLCAxLCBNb2RlbFJlZmFjdG9yaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kZWxSZWZhY3RvcmluZ19MYWJlbCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFiZWwiLCBudWxsLCAxLCAxLCBNb2RlbFJlZmFjdG9yaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kZWxSZWZhY3RvcmluZ19OYW1lc3BhY2VVcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVyaSIsIG51bGwsIDEsIDEsIE1vZGVsUmVmYWN0b3JpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRNb2RlbFJlZmFjdG9yaW5nX0lucHV0UG9ydHMoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgImlucHV0UG9ydHMiLCBudWxsLCAwLCAtMSwgTW9kZWxSZWZhY3RvcmluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MoYXRvbWljVW5pdEVDbGFzcywgQXRvbWljVW5pdC5jbGFzcywgIkF0b21pY1VuaXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRBdG9taWNVbml0X0lucHV0UG9ydHMoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgImlucHV0UG9ydHMiLCBudWxsLCAxLCAtMSwgQXRvbWljVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldEF0b21pY1VuaXRfVW5pdElkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1bml0SWQiLCBudWxsLCAxLCAxLCBBdG9taWNVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXRvbWljVW5pdF9MYWJlbCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFiZWwiLCBudWxsLCAxLCAxLCBBdG9taWNVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXRvbWljVW5pdF9OYW1lc3BhY2VVcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVyaSIsIG51bGwsIDEsIDEsIEF0b21pY1VuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRBdG9taWNVbml0X1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCAiQXRvbWljIFVuaXQiLCAwLCAxLCBBdG9taWNVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldEF0b21pY1VuaXRfTW9kZWxSZWZhY3RvcmluZygpLCB0aGlzLmdldE1vZGVsUmVmYWN0b3JpbmcoKSwgbnVsbCwgIm1vZGVsUmVmYWN0b3JpbmciLCBudWxsLCAxLCAxLCBBdG9taWNVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXRvbWljVW5pdF9DaGVja0luaXRpYWxDb25kaXRpb25GbGFnKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiY2hlY2tJbml0aWFsQ29uZGl0aW9uRmxhZyIsICJmYWxzZSIsIDAsIDEsIEF0b21pY1VuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRBdG9taWNVbml0X0NoZWNrRmluYWxDb25kaXRpb25GbGFnKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiY2hlY2tGaW5hbENvbmRpdGlvbkZsYWciLCAiZmFsc2UiLCAwLCAxLCBBdG9taWNVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhjb21wb3NpdGVVbml0RUNsYXNzLCBDb21wb3NpdGVVbml0LmNsYXNzLCAiQ29tcG9zaXRlVW5pdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJaW5pdEVDbGFzcyhzZXF1ZW50aWFsVW5pdEVDbGFzcywgU2VxdWVudGlhbFVuaXQuY2xhc3MsICJTZXF1ZW50aWFsVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcXVlbnRpYWxVbml0X0hlbHBlclVuaXRzKCksIHRoaXMuZ2V0SGVscGVyVW5pdCgpLCBudWxsLCAiaGVscGVyVW5pdHMiLCBudWxsLCAwLCAtMSwgU2VxdWVudGlhbFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRTZXF1ZW50aWFsVW5pdF9SZWZhY3RvcmluZ1VuaXRzKCksIHRoaXMuZ2V0UmVmYWN0b3JpbmdVbml0KCksIG51bGwsICJyZWZhY3RvcmluZ1VuaXRzIiwgbnVsbCwgMSwgLTEsIFNlcXVlbnRpYWxVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VxdWVudGlhbFVuaXRfSW5wdXRQb3J0cygpLCB0aGlzLmdldElucHV0UG9ydCgpLCBudWxsLCAiaW5wdXRQb3J0cyIsIG51bGwsIDEsIC0xLCBTZXF1ZW50aWFsVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFNlcXVlbnRpYWxVbml0X1N0cmljdCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0cmljdCIsICJ0cnVlIiwgMCwgMSwgU2VxdWVudGlhbFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXF1ZW50aWFsVW5pdF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgIlNlcXVlbnRpYWwgVW5pdCIsIDAsIDEsIFNlcXVlbnRpYWxVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFNlcXVlbnRpYWxVbml0X0xibFN0cmljdCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGJsU3RyaWN0IiwgInN0cmljdCIsIDAsIDEsIFNlcXVlbnRpYWxVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJYWRkRU9wZXJhdGlvbihzZXF1ZW50aWFsVW5pdEVDbGFzcywgbnVsbCwgInVwZGF0ZVNlcUV4ZWN1dGlvbk9yZGVyIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MoY29uZGl0aW9uQ2hlY2tFQ2xhc3MsIENvbmRpdGlvbkNoZWNrLmNsYXNzLCAiQ29uZGl0aW9uQ2hlY2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRDb25kaXRpb25DaGVja19UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgIkNvbmRpdGlvbiBDaGVjayIsIDAsIDEsIENvbmRpdGlvbkNoZWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldENvbmRpdGlvbkNoZWNrX1NwZWMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNwZWMiLCBudWxsLCAwLCAxLCBDb25kaXRpb25DaGVjay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MoY29uZGl0aW9uYWxVbml0RUNsYXNzLCBDb25kaXRpb25hbFVuaXQuY2xhc3MsICJDb25kaXRpb25hbFVuaXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRDb25kaXRpb25hbFVuaXRfSWYoKSwgdGhpcy5nZXRDb25kaXRpb25DaGVjaygpLCBudWxsLCAiaWYiLCBudWxsLCAxLCAxLCBDb25kaXRpb25hbFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRDb25kaXRpb25hbFVuaXRfSGVscGVyVW5pdHMoKSwgdGhpcy5nZXRIZWxwZXJVbml0KCksIG51bGwsICJoZWxwZXJVbml0cyIsIG51bGwsIDAsIC0xLCBDb25kaXRpb25hbFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRDb25kaXRpb25hbFVuaXRfVGhlbigpLCB0aGlzLmdldFJlZmFjdG9yaW5nVW5pdCgpLCBudWxsLCAidGhlbiIsIG51bGwsIDEsIDEsIENvbmRpdGlvbmFsVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldENvbmRpdGlvbmFsVW5pdF9FbHNlKCksIHRoaXMuZ2V0UmVmYWN0b3JpbmdVbml0KCksIG51bGwsICJlbHNlIiwgbnVsbCwgMCwgMSwgQ29uZGl0aW9uYWxVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29uZGl0aW9uYWxVbml0X0lucHV0UG9ydHMoKSwgdGhpcy5nZXRJbnB1dFBvcnQoKSwgbnVsbCwgImlucHV0UG9ydHMiLCBudWxsLCAxLCAtMSwgQ29uZGl0aW9uYWxVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZGl0aW9uYWxVbml0X1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCAiQ29uZGl0aW9uYWwgVW5pdCIsIDAsIDEsIENvbmRpdGlvbmFsVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKHF1ZXVlZFVuaXRFQ2xhc3MsIFF1ZXVlZFVuaXQuY2xhc3MsICJRdWV1ZWRVbml0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRRdWV1ZWRVbml0X1N0cmljdCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0cmljdCIsICJ0cnVlIiwgMCwgMSwgUXVldWVkVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWFkZEVPcGVyYXRpb24ocXVldWVkVW5pdEVDbGFzcywgbnVsbCwgImluaXQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhzaW5nbGVRdWV1ZWRVbml0RUNsYXNzLCBTaW5nbGVRdWV1ZWRVbml0LmNsYXNzLCAiU2luZ2xlUXVldWVkVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFNpbmdsZVF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKSwgdGhpcy5nZXRIZWxwZXJVbml0KCksIG51bGwsICJoZWxwZXJVbml0cyIsIG51bGwsIDAsIC0xLCBTaW5nbGVRdWV1ZWRVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2luZ2xlUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXQoKSwgdGhpcy5nZXRSZWZhY3RvcmluZ1VuaXQoKSwgbnVsbCwgInJlZmFjdG9yaW5nVW5pdCIsIG51bGwsIDEsIDEsIFNpbmdsZVF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRTaW5nbGVRdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgInNpbmdsZUlucHV0UG9ydHMiLCBudWxsLCAwLCAtMSwgU2luZ2xlUXVldWVkVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFNpbmdsZVF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnQoKSwgdGhpcy5nZXRNdWx0aUlucHV0UG9ydCgpLCBudWxsLCAibXVsdGlJbnB1dFBvcnQiLCBudWxsLCAxLCAxLCBTaW5nbGVRdWV1ZWRVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2luZ2xlUXVldWVkVW5pdF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgIlNpbmdsZSBRdWV1ZWQgVW5pdCIsIDAsIDEsIFNpbmdsZVF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2luZ2xlUXVldWVkVW5pdF9MYmxTdHJpY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxibFN0cmljdCIsICJzdHJpY3QiLCAwLCAxLCBTaW5nbGVRdWV1ZWRVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyh0d2ljZWRRdWV1ZWRVbml0RUNsYXNzLCBUd2ljZWRRdWV1ZWRVbml0LmNsYXNzLCAiVHdpY2VkUXVldWVkVW5pdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJaW5pdEVDbGFzcyhjYXJ0ZXNpYW5RdWV1ZWRVbml0RUNsYXNzLCBDYXJ0ZXNpYW5RdWV1ZWRVbml0LmNsYXNzLCAiQ2FydGVzaWFuUXVldWVkVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldENhcnRlc2lhblF1ZXVlZFVuaXRfSGVscGVyVW5pdHMoKSwgdGhpcy5nZXRIZWxwZXJVbml0KCksIG51bGwsICJoZWxwZXJVbml0cyIsIG51bGwsIDAsIC0xLCBDYXJ0ZXNpYW5RdWV1ZWRVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q2FydGVzaWFuUXVldWVkVW5pdF9SZWZhY3RvcmluZ1VuaXQoKSwgdGhpcy5nZXRSZWZhY3RvcmluZ1VuaXQoKSwgbnVsbCwgInJlZmFjdG9yaW5nVW5pdCIsIG51bGwsIDEsIDEsIENhcnRlc2lhblF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1NpbmdsZUlucHV0UG9ydHMoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgInNpbmdsZUlucHV0UG9ydHMiLCBudWxsLCAwLCAtMSwgQ2FydGVzaWFuUXVldWVkVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldENhcnRlc2lhblF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCksIHRoaXMuZ2V0TXVsdGlJbnB1dFBvcnQoKSwgbnVsbCwgIm11bHRpSW5wdXRQb3J0cyIsIG51bGwsIDIsIDIsIENhcnRlc2lhblF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCAiQ2FydGVzaWFuIFF1ZXVlZCBVbml0IiwgMCwgMSwgQ2FydGVzaWFuUXVldWVkVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X0xibFN0cmljdCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGJsU3RyaWN0IiwgInN0cmljdCIsIDAsIDEsIENhcnRlc2lhblF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKHBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcywgUGFyYWxsZWxRdWV1ZWRVbml0LmNsYXNzLCAiUGFyYWxsZWxRdWV1ZWRVbml0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X0hlbHBlclVuaXRzKCksIHRoaXMuZ2V0SGVscGVyVW5pdCgpLCBudWxsLCAiaGVscGVyVW5pdHMiLCBudWxsLCAwLCAtMSwgUGFyYWxsZWxRdWV1ZWRVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYWxsZWxRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdHMoKSwgdGhpcy5nZXRSZWZhY3RvcmluZ1VuaXQoKSwgbnVsbCwgInJlZmFjdG9yaW5nVW5pdHMiLCBudWxsLCAxLCAxLCBQYXJhbGxlbFF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpLCB0aGlzLmdldFNpbmdsZUlucHV0UG9ydCgpLCBudWxsLCAic2luZ2xlSW5wdXRQb3J0cyIsIG51bGwsIDAsIC0xLCBQYXJhbGxlbFF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCksIHRoaXMuZ2V0TXVsdGlJbnB1dFBvcnQoKSwgbnVsbCwgIm11bHRpSW5wdXRQb3J0cyIsIG51bGwsIDIsIDIsIFBhcmFsbGVsUXVldWVkVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFBhcmFsbGVsUXVldWVkVW5pdF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgIlBhcmFsbGVsIFF1ZXVlZCBVbml0IiwgMCwgMSwgUGFyYWxsZWxRdWV1ZWRVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFBhcmFsbGVsUXVldWVkVW5pdF9MYmxTdHJpY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxibFN0cmljdCIsICJzdHJpY3QiLCAwLCAxLCBQYXJhbGxlbFF1ZXVlZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKGhlbHBlclVuaXRFQ2xhc3MsIEhlbHBlclVuaXQuY2xhc3MsICJIZWxwZXJVbml0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRIZWxwZXJVbml0X0hlbHBlclVuaXRJZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaGVscGVyVW5pdElkIiwgbnVsbCwgMSwgMSwgSGVscGVyVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFQXR0cmlidXRlKGdldEhlbHBlclVuaXRfTmFtZXNwYWNlVXJpKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVcmkiLCBudWxsLCAxLCAxLCBIZWxwZXJVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJYWRkRU9wZXJhdGlvbihoZWxwZXJVbml0RUNsYXNzLCB0aGlzLmdldElucHV0UG9ydCgpLCAiZ2V0SW5wdXRQb3J0IiwgMSwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsNCisNCisJCWFkZEVPcGVyYXRpb24oaGVscGVyVW5pdEVDbGFzcywgdGhpcy5nZXRPdXRwdXRQb3J0KCksICJnZXRPdXRwdXRQb3J0IiwgMSwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MoZmVhdHVyZVVuaXRFQ2xhc3MsIEZlYXR1cmVVbml0LmNsYXNzLCAiRmVhdHVyZVVuaXQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisNCisJCWluaXRFQ2xhc3Moc2luZ2xlRmVhdHVyZVVuaXRFQ2xhc3MsIFNpbmdsZUZlYXR1cmVVbml0LmNsYXNzLCAiU2luZ2xlRmVhdHVyZVVuaXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRTaW5nbGVGZWF0dXJlVW5pdF9JbnB1dFBvcnQoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgImlucHV0UG9ydCIsIG51bGwsIDEsIDEsIFNpbmdsZUZlYXR1cmVVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2luZ2xlRmVhdHVyZVVuaXRfU2Vjb25kYXJ5SW5wdXRQb3J0cygpLCB0aGlzLmdldE11bHRpSW5wdXRQb3J0KCksIG51bGwsICJzZWNvbmRhcnlJbnB1dFBvcnRzIiwgbnVsbCwgMCwgLTEsIFNpbmdsZUZlYXR1cmVVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2luZ2xlRmVhdHVyZVVuaXRfT3V0cHV0UG9ydCgpLCB0aGlzLmdldFNpbmdsZU91dHB1dFBvcnQoKSwgbnVsbCwgIm91dHB1dFBvcnQiLCBudWxsLCAxLCAxLCBTaW5nbGVGZWF0dXJlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFNpbmdsZUZlYXR1cmVVbml0X1NpbmdsZUZlYXR1cmVIZWxwZXIoKSwgdGhpcy5nZXRTaW5nbGVGZWF0dXJlSGVscGVyKCksIG51bGwsICJzaW5nbGVGZWF0dXJlSGVscGVyIiwgbnVsbCwgMSwgMSwgU2luZ2xlRmVhdHVyZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRTaW5nbGVGZWF0dXJlVW5pdF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgIlNpbmdsZSBGZWF0dXJlIFVuaXQiLCAwLCAxLCBTaW5nbGVGZWF0dXJlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKG11bHRpRmVhdHVyZVVuaXRFQ2xhc3MsIE11bHRpRmVhdHVyZVVuaXQuY2xhc3MsICJNdWx0aUZlYXR1cmVVbml0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TXVsdGlGZWF0dXJlVW5pdF9JbnB1dFBvcnQoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgImlucHV0UG9ydCIsIG51bGwsIDEsIDEsIE11bHRpRmVhdHVyZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRNdWx0aUZlYXR1cmVVbml0X1NlY29uZGFyeUlucHV0UG9ydHMoKSwgdGhpcy5nZXRNdWx0aUlucHV0UG9ydCgpLCBudWxsLCAic2Vjb25kYXJ5SW5wdXRQb3J0cyIsIG51bGwsIDAsIC0xLCBNdWx0aUZlYXR1cmVVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TXVsdGlGZWF0dXJlVW5pdF9PdXRwdXRQb3J0KCksIHRoaXMuZ2V0TXVsdGlPdXRwdXRQb3J0KCksIG51bGwsICJvdXRwdXRQb3J0IiwgbnVsbCwgMSwgMSwgTXVsdGlGZWF0dXJlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldE11bHRpRmVhdHVyZVVuaXRfTXVsdGlGZWF0dXJlSGVscGVyKCksIHRoaXMuZ2V0TXVsdGlGZWF0dXJlSGVscGVyKCksIG51bGwsICJtdWx0aUZlYXR1cmVIZWxwZXIiLCBudWxsLCAxLCAxLCBNdWx0aUZlYXR1cmVVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TXVsdGlGZWF0dXJlVW5pdF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgIk11bHRpIEZlYXR1cmUgVW5pdCIsIDAsIDEsIE11bHRpRmVhdHVyZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhmaWx0ZXJVbml0RUNsYXNzLCBGaWx0ZXJVbml0LmNsYXNzLCAiRmlsdGVyVW5pdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJaW5pdEVDbGFzcyhzaW5nbGVGaWx0ZXJVbml0RUNsYXNzLCBTaW5nbGVGaWx0ZXJVbml0LmNsYXNzLCAiU2luZ2xlRmlsdGVyVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFNpbmdsZUZpbHRlclVuaXRfSW5wdXRQb3J0KCksIHRoaXMuZ2V0TXVsdGlJbnB1dFBvcnQoKSwgbnVsbCwgImlucHV0UG9ydCIsIG51bGwsIDEsIDEsIFNpbmdsZUZpbHRlclVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRTaW5nbGVGaWx0ZXJVbml0X091dHB1dFBvcnQoKSwgdGhpcy5nZXRTaW5nbGVPdXRwdXRQb3J0KCksIG51bGwsICJvdXRwdXRQb3J0IiwgbnVsbCwgMSwgMSwgU2luZ2xlRmlsdGVyVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFNpbmdsZUZpbHRlclVuaXRfU2luZ2xlRmlsdGVySGVscGVyKCksIHRoaXMuZ2V0U2luZ2xlRmlsdGVySGVscGVyKCksIG51bGwsICJzaW5nbGVGaWx0ZXJIZWxwZXIiLCBudWxsLCAxLCAxLCBTaW5nbGVGaWx0ZXJVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2luZ2xlRmlsdGVyVW5pdF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgIlNpbmdsZSBGaWx0ZXIgVW5pdCIsIDAsIDEsIFNpbmdsZUZpbHRlclVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhtdWx0aUZpbHRlclVuaXRFQ2xhc3MsIE11bHRpRmlsdGVyVW5pdC5jbGFzcywgIk11bHRpRmlsdGVyVW5pdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldE11bHRpRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSwgdGhpcy5nZXRNdWx0aUlucHV0UG9ydCgpLCBudWxsLCAiaW5wdXRQb3J0IiwgbnVsbCwgMSwgMSwgTXVsdGlGaWx0ZXJVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TXVsdGlGaWx0ZXJVbml0X091dHB1dFBvcnQoKSwgdGhpcy5nZXRNdWx0aU91dHB1dFBvcnQoKSwgbnVsbCwgIm91dHB1dFBvcnQiLCBudWxsLCAxLCAxLCBNdWx0aUZpbHRlclVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRNdWx0aUZpbHRlclVuaXRfTXVsdGlGaWx0ZXJIZWxwZXIoKSwgdGhpcy5nZXRNdWx0aUZpbHRlckhlbHBlcigpLCBudWxsLCAibXVsdGlGaWx0ZXJIZWxwZXIiLCBudWxsLCAxLCAxLCBNdWx0aUZpbHRlclVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRNdWx0aUZpbHRlclVuaXRfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsICJNdWx0aSBGaWx0ZXIgVW5pdCIsIDAsIDEsIE11bHRpRmlsdGVyVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKGhlbHBlckVDbGFzcywgSGVscGVyLmNsYXNzLCAiSGVscGVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRIZWxwZXJfSGVscGVySWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImhlbHBlcklkIiwgbnVsbCwgMSwgMSwgSGVscGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGVscGVyX05hbWVzcGFjZVVyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVXJpIiwgbnVsbCwgMSwgMSwgSGVscGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhmZWF0dXJlSGVscGVyRUNsYXNzLCBGZWF0dXJlSGVscGVyLmNsYXNzLCAiRmVhdHVyZUhlbHBlciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RmVhdHVyZUhlbHBlcl9JbnB1dFBvcnQoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgImlucHV0UG9ydCIsIG51bGwsIDEsIDEsIEZlYXR1cmVIZWxwZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRGZWF0dXJlSGVscGVyX1NlY29uZGFyeUlucHV0UG9ydHMoKSwgdGhpcy5nZXRNdWx0aUlucHV0UG9ydCgpLCBudWxsLCAic2Vjb25kYXJ5SW5wdXRQb3J0cyIsIG51bGwsIDAsIC0xLCBGZWF0dXJlSGVscGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhzaW5nbGVGZWF0dXJlSGVscGVyRUNsYXNzLCBTaW5nbGVGZWF0dXJlSGVscGVyLmNsYXNzLCAiU2luZ2xlRmVhdHVyZUhlbHBlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldFNpbmdsZUZlYXR1cmVIZWxwZXJfT3V0cHV0UG9ydCgpLCB0aGlzLmdldFNpbmdsZU91dHB1dFBvcnQoKSwgbnVsbCwgIm91dHB1dFBvcnQiLCBudWxsLCAxLCAxLCBTaW5nbGVGZWF0dXJlSGVscGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhtdWx0aUZlYXR1cmVIZWxwZXJFQ2xhc3MsIE11bHRpRmVhdHVyZUhlbHBlci5jbGFzcywgIk11bHRpRmVhdHVyZUhlbHBlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldE11bHRpRmVhdHVyZUhlbHBlcl9PdXRwdXRQb3J0KCksIHRoaXMuZ2V0TXVsdGlPdXRwdXRQb3J0KCksIG51bGwsICJvdXRwdXRQb3J0IiwgbnVsbCwgMSwgMSwgTXVsdGlGZWF0dXJlSGVscGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhmaWx0ZXJIZWxwZXJFQ2xhc3MsIEZpbHRlckhlbHBlci5jbGFzcywgIkZpbHRlckhlbHBlciIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVySGVscGVyX0lucHV0UG9ydCgpLCB0aGlzLmdldE11bHRpSW5wdXRQb3J0KCksIG51bGwsICJpbnB1dFBvcnQiLCBudWxsLCAxLCAxLCBGaWx0ZXJIZWxwZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKHNpbmdsZUZpbHRlckhlbHBlckVDbGFzcywgU2luZ2xlRmlsdGVySGVscGVyLmNsYXNzLCAiU2luZ2xlRmlsdGVySGVscGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2luZ2xlRmlsdGVySGVscGVyX091dHB1dFBvcnQoKSwgdGhpcy5nZXRTaW5nbGVPdXRwdXRQb3J0KCksIG51bGwsICJvdXRwdXRQb3J0IiwgbnVsbCwgMSwgMSwgU2luZ2xlRmlsdGVySGVscGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhtdWx0aUZpbHRlckhlbHBlckVDbGFzcywgTXVsdGlGaWx0ZXJIZWxwZXIuY2xhc3MsICJNdWx0aUZpbHRlckhlbHBlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldE11bHRpRmlsdGVySGVscGVyX091dHB1dFBvcnQoKSwgdGhpcy5nZXRNdWx0aU91dHB1dFBvcnQoKSwgbnVsbCwgIm91dHB1dFBvcnQiLCBudWxsLCAxLCAxLCBNdWx0aUZpbHRlckhlbHBlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MocG9ydEVDbGFzcywgUG9ydC5jbGFzcywgIlBvcnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFBvcnRfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUphdmFDbGFzcygpLCAidHlwZSIsIG51bGwsIDEsIDEsIFBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlvcCA9IGFkZEVPcGVyYXRpb24ocG9ydEVDbGFzcywgbnVsbCwgInNldFR5cGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOw0KKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVKYXZhQ2xhc3MoKSwgIm5ld1R5cGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOw0KKwkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbml0aWF0b3IiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOw0KKw0KKwkJb3AgPSBhZGRFT3BlcmF0aW9uKHBvcnRFQ2xhc3MsIG51bGwsICJ1cGRhdGVQb3J0TmFtZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2luZ3VsYXJQb3J0TmFtZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlhZGRFT3BlcmF0aW9uKHBvcnRFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRTaW5ndWxhclBvcnROYW1lIiwgMCwgMSwgSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3Moc2luZ2xlUG9ydEVDbGFzcywgU2luZ2xlUG9ydC5jbGFzcywgIlNpbmdsZVBvcnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFQXR0cmlidXRlKGdldFNpbmdsZVBvcnRfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVKYXZhT2JqZWN0KCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFNpbmdsZVBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKG11bHRpUG9ydEVDbGFzcywgTXVsdGlQb3J0LmNsYXNzLCAiTXVsdGlQb3J0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RUF0dHJpYnV0ZShnZXRNdWx0aVBvcnRfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVKYXZhT2JqZWN0KCksICJ2YWx1ZSIsIG51bGwsIDAsIC0xLCBNdWx0aVBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKGlucHV0UG9ydEVDbGFzcywgSW5wdXRQb3J0LmNsYXNzLCAiSW5wdXRQb3J0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorDQorCQlhZGRFT3BlcmF0aW9uKGlucHV0UG9ydEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuT2JqZWN0KCksICJpc01hcHBpbmdUYXJnZXQiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOw0KKw0KKwkJYWRkRU9wZXJhdGlvbihpbnB1dFBvcnRFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLCAiaXNSb290UG9ydCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKG91dHB1dFBvcnRFQ2xhc3MsIE91dHB1dFBvcnQuY2xhc3MsICJPdXRwdXRQb3J0IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorDQorCQlpbml0RUNsYXNzKHNpbmdsZUlucHV0UG9ydEVDbGFzcywgU2luZ2xlSW5wdXRQb3J0LmNsYXNzLCAiU2luZ2xlSW5wdXRQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJaW5pdEVDbGFzcyhtdWx0aUlucHV0UG9ydEVDbGFzcywgTXVsdGlJbnB1dFBvcnQuY2xhc3MsICJNdWx0aUlucHV0UG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisNCisJCWluaXRFQ2xhc3Moc2luZ2xlT3V0cHV0UG9ydEVDbGFzcywgU2luZ2xlT3V0cHV0UG9ydC5jbGFzcywgIlNpbmdsZU91dHB1dFBvcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorDQorCQlpbml0RUNsYXNzKG11bHRpT3V0cHV0UG9ydEVDbGFzcywgTXVsdGlPdXRwdXRQb3J0LmNsYXNzLCAiTXVsdGlPdXRwdXRQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJaW5pdEVDbGFzcyhwb3J0TWFwcGluZ0VDbGFzcywgUG9ydE1hcHBpbmcuY2xhc3MsICJQb3J0TWFwcGluZyIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKw0KKwkJYWRkRU9wZXJhdGlvbihwb3J0TWFwcGluZ0VDbGFzcywgdGhpcy5nZXRQb3J0KCksICJnZXRTb3VyY2UiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOw0KKw0KKwkJYWRkRU9wZXJhdGlvbihwb3J0TWFwcGluZ0VDbGFzcywgdGhpcy5nZXRJbnB1dFBvcnQoKSwgImdldFRhcmdldCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlvcCA9IGFkZEVPcGVyYXRpb24ocG9ydE1hcHBpbmdFQ2xhc3MsIG51bGwsICJ1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RUphdmFDbGFzcygpLCAidHlwZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2luZ3VsYXJQb3J0TmFtZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlhZGRFT3BlcmF0aW9uKHBvcnRNYXBwaW5nRUNsYXNzLCBudWxsLCAidXBkYXRlTWFwcGluZ051bWJlciIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlhZGRFT3BlcmF0aW9uKHBvcnRNYXBwaW5nRUNsYXNzLCBudWxsLCAidXBkYXRlVmlzdWFsaXphdGlvbiIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7DQorDQorCQlpbml0RUNsYXNzKHNpbmdsZVBvcnRNYXBwaW5nRUNsYXNzLCBTaW5nbGVQb3J0TWFwcGluZy5jbGFzcywgIlNpbmdsZVBvcnRNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2luZ2xlUG9ydE1hcHBpbmdfU291cmNlKCksIHRoaXMuZ2V0U2luZ2xlUG9ydCgpLCBudWxsLCAic291cmNlIiwgbnVsbCwgMCwgMSwgU2luZ2xlUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRTaW5nbGVQb3J0TWFwcGluZ19UYXJnZXQoKSwgdGhpcy5nZXRTaW5nbGVJbnB1dFBvcnQoKSwgbnVsbCwgInRhcmdldCIsIG51bGwsIDAsIDEsIFNpbmdsZVBvcnRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJaW5pdEVDbGFzcyhtdWx0aVBvcnRNYXBwaW5nRUNsYXNzLCBNdWx0aVBvcnRNYXBwaW5nLmNsYXNzLCAiTXVsdGlQb3J0TWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldE11bHRpUG9ydE1hcHBpbmdfU291cmNlKCksIHRoaXMuZ2V0TXVsdGlQb3J0KCksIG51bGwsICJzb3VyY2UiLCBudWxsLCAwLCAxLCBNdWx0aVBvcnRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKwkJaW5pdEVSZWZlcmVuY2UoZ2V0TXVsdGlQb3J0TWFwcGluZ19UYXJnZXQoKSwgdGhpcy5nZXRNdWx0aUlucHV0UG9ydCgpLCBudWxsLCAidGFyZ2V0IiwgbnVsbCwgMCwgMSwgTXVsdGlQb3J0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisNCisJCWluaXRFQ2xhc3MobXVsdGlTaW5nbGVQb3J0TWFwcGluZ0VDbGFzcywgTXVsdGlTaW5nbGVQb3J0TWFwcGluZy5jbGFzcywgIk11bHRpU2luZ2xlUG9ydE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7DQorCQlpbml0RVJlZmVyZW5jZShnZXRNdWx0aVNpbmdsZVBvcnRNYXBwaW5nX1NvdXJjZSgpLCB0aGlzLmdldE11bHRpUG9ydCgpLCBudWxsLCAic291cmNlIiwgbnVsbCwgMCwgMSwgTXVsdGlTaW5nbGVQb3J0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisJCWluaXRFUmVmZXJlbmNlKGdldE11bHRpU2luZ2xlUG9ydE1hcHBpbmdfVGFyZ2V0KCksIHRoaXMuZ2V0U2luZ2xlSW5wdXRQb3J0KCksIG51bGwsICJ0YXJnZXQiLCBudWxsLCAwLCAxLCBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKwkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMNCisJCWluaXRFRW51bShtYXBwaW5nVmlzdWFsaXphdGlvbkVFbnVtLCBNYXBwaW5nVmlzdWFsaXphdGlvbi5jbGFzcywgIk1hcHBpbmdWaXN1YWxpemF0aW9uIik7DQorCQlhZGRFRW51bUxpdGVyYWwobWFwcGluZ1Zpc3VhbGl6YXRpb25FRW51bSwgTWFwcGluZ1Zpc3VhbGl6YXRpb24uQVJST1dTKTsNCisJCWFkZEVFbnVtTGl0ZXJhbChtYXBwaW5nVmlzdWFsaXphdGlvbkVFbnVtLCBNYXBwaW5nVmlzdWFsaXphdGlvbi5DT0xPUkVEX1BPUlRTKTsNCisJCWFkZEVFbnVtTGl0ZXJhbChtYXBwaW5nVmlzdWFsaXphdGlvbkVFbnVtLCBNYXBwaW5nVmlzdWFsaXphdGlvbi5JTkRJQ0VTKTsNCisJCWFkZEVFbnVtTGl0ZXJhbChtYXBwaW5nVmlzdWFsaXphdGlvbkVFbnVtLCBNYXBwaW5nVmlzdWFsaXphdGlvbi5BUlJPV1NfQU5EX0NPTE9SRURfUE9SVFMpOw0KKwkJYWRkRUVudW1MaXRlcmFsKG1hcHBpbmdWaXN1YWxpemF0aW9uRUVudW0sIE1hcHBpbmdWaXN1YWxpemF0aW9uLkFSUk9XU19BTkRfSU5ESUNFUyk7DQorDQorCQkvLyBDcmVhdGUgcmVzb3VyY2UNCisJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOw0KKw0KKwkJLy8gQ3JlYXRlIGFubm90YXRpb25zDQorCQkvLyBnbWYNCisJCWNyZWF0ZUdtZkFubm90YXRpb25zKCk7DQorCQkvLyBnbWYuZGlhZ3JhbQ0KKwkJY3JlYXRlR21mXzFBbm5vdGF0aW9ucygpOw0KKwkJLy8gZ21mLm5vZGUNCisJCWNyZWF0ZUdtZl8yQW5ub3RhdGlvbnMoKTsNCisJCS8vIGdtZi5hZmZpeGVkDQorCQljcmVhdGVHbWZfM0Fubm90YXRpb25zKCk7DQorCQkvLyBnbWYuY29tcGFydG1lbnQNCisJCWNyZWF0ZUdtZl80QW5ub3RhdGlvbnMoKTsNCisJCS8vIGdtZi5saW5rDQorCQljcmVhdGVHbWZfNUFubm90YXRpb25zKCk7DQorCX0NCisNCisJLyoqDQorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+Z21mPC9iPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdtZkFubm90YXRpb25zKCkgew0KKwkJU3RyaW5nIHNvdXJjZSA9ICJnbWYiOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgICh0aGlzLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJDQorCX0NCisNCisJLyoqDQorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+Z21mLmRpYWdyYW08L2I+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlR21mXzFBbm5vdGF0aW9ucygpIHsNCisJCVN0cmluZyBzb3VyY2UgPSAiZ21mLmRpYWdyYW0iOwkJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoY29tcG9zaXRlUmVmYWN0b3JpbmdFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIiwNCisJCQkgIm9uZWZpbGUiLCAiZmFsc2UiDQorCQkgICB9KTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJDQorCX0NCisNCisJLyoqDQorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+Z21mLm5vZGU8L2I+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlR21mXzJBbm5vdGF0aW9ucygpIHsNCisJCVN0cmluZyBzb3VyY2UgPSAiZ21mLm5vZGUiOwkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGF0b21pY1VuaXRFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIiwNCisJCQkgImxhYmVsLmljb24iLCAiZmFsc2UiLA0KKwkJCSAibGFiZWwiLCAibGFiZWwsdHlwZSIsDQorCQkJICJsYWJlbC5wYXR0ZXJuIiwgInswfTp7MX0iDQorCQkgICB9KTsJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKHNlcXVlbnRpYWxVbml0RUNsYXNzLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciIsDQorCQkJICJsYWJlbC5pY29uIiwgImZhbHNlIiwNCisJCQkgImxhYmVsIiwgIm5hbWUsdHlwZSxsYmxTdHJpY3QiLA0KKwkJCSAibGFiZWwucGF0dGVybiIsICJ7MH06ezF9IC17Mn0tIg0KKwkJICAgfSk7CQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGNvbmRpdGlvbkNoZWNrRUNsYXNzLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciIsDQorCQkJICJsYWJlbC5pY29uIiwgImZhbHNlIiwNCisJCQkgImxhYmVsIiwgIm5hbWUsdHlwZSxzcGVjIiwNCisJCQkgImxhYmVsLnBhdHRlcm4iLCAiezB9OnsxfSAtezJ9LSINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChjb25kaXRpb25hbFVuaXRFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIiwNCisJCQkgImxhYmVsLmljb24iLCAiZmFsc2UiLA0KKwkJCSAibGFiZWwiLCAibmFtZSx0eXBlIiwNCisJCQkgImxhYmVsLnBhdHRlcm4iLCAiezB9OnsxfSINCisJCSAgIH0pOwkJCQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKHNpbmdsZVF1ZXVlZFVuaXRFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIiwNCisJCQkgImxhYmVsLmljb24iLCAiZmFsc2UiLA0KKwkJCSAibGFiZWwiLCAibmFtZSx0eXBlLGxibFN0cmljdCIsDQorCQkJICJsYWJlbC5wYXR0ZXJuIiwgInswfTp7MX0gLXsyfS0iDQorCQkgICB9KTsJCQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGNhcnRlc2lhblF1ZXVlZFVuaXRFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIiwNCisJCQkgImxhYmVsLmljb24iLCAiZmFsc2UiLA0KKwkJCSAibGFiZWwiLCAibmFtZSx0eXBlLGxibFN0cmljdCIsDQorCQkJICJsYWJlbC5wYXR0ZXJuIiwgInswfTp7MX0gLXsyfS0iDQorCQkgICB9KTsJCQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKHBhcmFsbGVsUXVldWVkVW5pdEVDbGFzcywgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiLA0KKwkJCSAibGFiZWwuaWNvbiIsICJmYWxzZSIsDQorCQkJICJsYWJlbCIsICJuYW1lLHR5cGUsbGJsU3RyaWN0IiwNCisJCQkgImxhYmVsLnBhdHRlcm4iLCAiezB9OnsxfSAtezJ9LSINCisJCSAgIH0pOwkJCQkJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoc2luZ2xlRmVhdHVyZVVuaXRFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIiwNCisJCQkgImxhYmVsLmljb24iLCAiZmFsc2UiLA0KKwkJCSAibGFiZWwiLCAibmFtZSx0eXBlIiwNCisJCQkgImxhYmVsLnBhdHRlcm4iLCAiezB9OnsxfSINCisJCSAgIH0pOwkJCQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChtdWx0aUZlYXR1cmVVbml0RUNsYXNzLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciIsDQorCQkJICJsYWJlbC5pY29uIiwgImZhbHNlIiwNCisJCQkgImxhYmVsIiwgIm5hbWUsdHlwZSIsDQorCQkJICJsYWJlbC5wYXR0ZXJuIiwgInswfTp7MX0iDQorCQkgICB9KTsJCQkJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoc2luZ2xlRmlsdGVyVW5pdEVDbGFzcywgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiLA0KKwkJCSAibGFiZWwuaWNvbiIsICJmYWxzZSIsDQorCQkJICJsYWJlbCIsICJuYW1lLHR5cGUiLA0KKwkJCSAibGFiZWwucGF0dGVybiIsICJ7MH06ezF9Ig0KKwkJICAgfSk7CQkJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAobXVsdGlGaWx0ZXJVbml0RUNsYXNzLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciIsDQorCQkJICJsYWJlbC5pY29uIiwgImZhbHNlIiwNCisJCQkgImxhYmVsIiwgIm5hbWUsdHlwZSIsDQorCQkJICJsYWJlbC5wYXR0ZXJuIiwgInswfTp7MX0iDQorCQkgICB9KTsJCQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChwb3J0RUNsYXNzLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciIsDQorCQkJICJsYWJlbCIsICJuYW1lLHR5cGUiLA0KKwkJCSAibGFiZWwuaWNvbiIsICJmYWxzZSIsDQorCQkJICJsYWJlbC5wbGFjZW1lbnQiLCAiZXh0ZXJuYWwiLA0KKwkJCSAibGFiZWwucGF0dGVybiIsICJ7MH06ezF9Ig0KKwkJICAgfSk7CQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKG11bHRpUG9ydEVDbGFzcywgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImJvcmRlci5jb2xvciIsICIyNTUsMCwwIiwNCisJCQkgImJvcmRlci53aWR0aCIsICIxMCINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChpbnB1dFBvcnRFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmaWd1cmUiLCAicmVjdGFuZ2xlIiwNCisJCQkgInNpemUiLCAiMjAsMjAiDQorCQkgICB9KTsJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAob3V0cHV0UG9ydEVDbGFzcywgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZpZ3VyZSIsICJlbGxpcHNlIiwNCisJCQkgInNpemUiLCAiMjAsMjAiDQorCQkgICB9KTsJCQkNCisJfQ0KKw0KKwkvKioNCisJICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5nbWYuYWZmaXhlZDwvYj4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHbWZfM0Fubm90YXRpb25zKCkgew0KKwkJU3RyaW5nIHNvdXJjZSA9ICJnbWYuYWZmaXhlZCI7CQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldEF0b21pY1VuaXRfSW5wdXRQb3J0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJCQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRTZXF1ZW50aWFsVW5pdF9JbnB1dFBvcnRzKCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJCQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldENvbmRpdGlvbmFsVW5pdF9JbnB1dFBvcnRzKCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldFNpbmdsZVF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRTaW5nbGVRdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0KCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldENhcnRlc2lhblF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X011bHRpSW5wdXRQb3J0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJCQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfU2luZ2xlSW5wdXRQb3J0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfTXVsdGlJbnB1dFBvcnRzKCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRTaW5nbGVGZWF0dXJlVW5pdF9JbnB1dFBvcnQoKSwgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiDQorCQkgICB9KTsJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoZ2V0U2luZ2xlRmVhdHVyZVVuaXRfU2Vjb25kYXJ5SW5wdXRQb3J0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRTaW5nbGVGZWF0dXJlVW5pdF9PdXRwdXRQb3J0KCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRNdWx0aUZlYXR1cmVVbml0X0lucHV0UG9ydCgpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRNdWx0aUZlYXR1cmVVbml0X1NlY29uZGFyeUlucHV0UG9ydHMoKSwgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiDQorCQkgICB9KTsJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoZ2V0TXVsdGlGZWF0dXJlVW5pdF9PdXRwdXRQb3J0KCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRTaW5nbGVGaWx0ZXJVbml0X0lucHV0UG9ydCgpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRTaW5nbGVGaWx0ZXJVbml0X091dHB1dFBvcnQoKSwgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiDQorCQkgICB9KTsJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldE11bHRpRmlsdGVyVW5pdF9JbnB1dFBvcnQoKSwgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiDQorCQkgICB9KTsJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoZ2V0TXVsdGlGaWx0ZXJVbml0X091dHB1dFBvcnQoKSwgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiDQorCQkgICB9KTsJCQkJCQkJDQorCX0NCisNCisJLyoqDQorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+Z21mLmNvbXBhcnRtZW50PC9iPi4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdtZl80QW5ub3RhdGlvbnMoKSB7DQorCQlTdHJpbmcgc291cmNlID0gImdtZi5jb21wYXJ0bWVudCI7CQkJCQkJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoZ2V0U2VxdWVudGlhbFVuaXRfSGVscGVyVW5pdHMoKSwgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiDQorCQkgICB9KTsJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoZ2V0U2VxdWVudGlhbFVuaXRfUmVmYWN0b3JpbmdVbml0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJCQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRDb25kaXRpb25hbFVuaXRfSWYoKSwgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgImZvbyIsICJiYXIiDQorCQkgICB9KTsJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoZ2V0Q29uZGl0aW9uYWxVbml0X0hlbHBlclVuaXRzKCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldENvbmRpdGlvbmFsVW5pdF9UaGVuKCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldENvbmRpdGlvbmFsVW5pdF9FbHNlKCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJCQ0KKwkJYWRkQW5ub3RhdGlvbg0KKwkJICAoZ2V0U2luZ2xlUXVldWVkVW5pdF9IZWxwZXJVbml0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRTaW5nbGVRdWV1ZWRVbml0X1JlZmFjdG9yaW5nVW5pdCgpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJCQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRDYXJ0ZXNpYW5RdWV1ZWRVbml0X0hlbHBlclVuaXRzKCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldENhcnRlc2lhblF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0KCksIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJmb28iLCAiYmFyIg0KKwkJICAgfSk7CQkJCQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKGdldFBhcmFsbGVsUXVldWVkVW5pdF9IZWxwZXJVbml0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChnZXRQYXJhbGxlbFF1ZXVlZFVuaXRfUmVmYWN0b3JpbmdVbml0cygpLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAiZm9vIiwgImJhciINCisJCSAgIH0pOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJDQorCX0NCisNCisJLyoqDQorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+Z21mLmxpbms8L2I+Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlR21mXzVBbm5vdGF0aW9ucygpIHsNCisJCVN0cmluZyBzb3VyY2UgPSAiZ21mLmxpbmsiOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChzaW5nbGVQb3J0TWFwcGluZ0VDbGFzcywgDQorCQkgICBzb3VyY2UsIA0KKwkJICAgbmV3IFN0cmluZ1tdIHsNCisJCQkgInNvdXJjZSIsICJzb3VyY2UiLA0KKwkJCSAidGFyZ2V0IiwgInRhcmdldCIsDQorCQkJICJzdHlsZSIsICJkb3QiLA0KKwkJCSAid2lkdGgiLCAiMiIsDQorCQkJICJ0YXJnZXQuZGVjb3JhdGlvbiIsICJhcnJvdyINCisJCSAgIH0pOwkJDQorCQlhZGRBbm5vdGF0aW9uDQorCQkgIChtdWx0aVBvcnRNYXBwaW5nRUNsYXNzLCANCisJCSAgIHNvdXJjZSwgDQorCQkgICBuZXcgU3RyaW5nW10gew0KKwkJCSAic291cmNlIiwgInNvdXJjZSIsDQorCQkJICJ0YXJnZXQiLCAidGFyZ2V0IiwNCisJCQkgInN0eWxlIiwgImRvdCIsDQorCQkJICJ3aWR0aCIsICIyIiwNCisJCQkgInRhcmdldC5kZWNvcmF0aW9uIiwgImFycm93Ig0KKwkJICAgfSk7CQkNCisJCWFkZEFubm90YXRpb24NCisJCSAgKG11bHRpU2luZ2xlUG9ydE1hcHBpbmdFQ2xhc3MsIA0KKwkJICAgc291cmNlLCANCisJCSAgIG5ldyBTdHJpbmdbXSB7DQorCQkJICJzb3VyY2UiLCAic291cmNlIiwNCisJCQkgInRhcmdldCIsICJ0YXJnZXQiLA0KKwkJCSAic3R5bGUiLCAiZG90IiwNCisJCQkgIndpZHRoIiwgIjIiLA0KKwkJCSAidGFyZ2V0LmRlY29yYXRpb24iLCAiYXJyb3ciLA0KKwkJCSAidG9vbC5zbWFsbC5idW5kbGUiLCAibmFtZSINCisJCSAgIH0pOw0KKwl9DQorDQorfSAvL0NvbXJlbFBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29uZGl0aW9uQ2hlY2tJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Db25kaXRpb25DaGVja0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODk1YTkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29uZGl0aW9uQ2hlY2tJbXBsLmphdmEKQEAgLTAsMCArMSwzNDQgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25DaGVjazsNCitpbXBvcnQgY29tcmVsLkRlc2NyaWJlZEVsZW1lbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmRpdGlvbiBDaGVjazwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Db25kaXRpb25DaGVja0ltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNvbmRpdGlvbkNoZWNrSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Db25kaXRpb25DaGVja0ltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNvbmRpdGlvbkNoZWNrSW1wbCNnZXRTcGVjIDxlbT5TcGVjPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uQ2hlY2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb25kaXRpb25DaGVjayB7DQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gIkNvbmRpdGlvbiBDaGVjayI7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWMoKSA8ZW0+U3BlYzwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0U3BlYygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNQRUNfRURFRkFVTFQgPSBudWxsOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlYygpIDxlbT5TcGVjPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRTcGVjKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBzcGVjID0gU1BFQ19FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29uZGl0aW9uQ2hlY2tJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTl9DSEVDSzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisJCXJldHVybiBuYW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgew0KKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOw0KKwkJbmFtZSA9IG5ld05hbWU7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7DQorCQlyZXR1cm4gZGVzY3JpcHRpb247DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsNCisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KKwkJcmV0dXJuIHR5cGU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFNwZWMoKSB7DQorCQlyZXR1cm4gc3BlYzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFNwZWMoU3RyaW5nIG5ld1NwZWMpIHsNCisJCVN0cmluZyBvbGRTcGVjID0gc3BlYzsNCisJCXNwZWMgPSBuZXdTcGVjOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OX0NIRUNLX19TUEVDLCBvbGRTcGVjLCBzcGVjKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OX0NIRUNLX19OQU1FOg0KKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX0RFU0NSSVBUSU9OOg0KKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OX0NIRUNLX19UWVBFOg0KKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX1NQRUM6DQorCQkJCXJldHVybiBnZXRTcGVjKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OX0NIRUNLX19OQU1FOg0KKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fREVTQ1JJUFRJT046DQorCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fU1BFQzoNCisJCQkJc2V0U3BlYygoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OX0NIRUNLX19OQU1FOg0KKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fREVTQ1JJUFRJT046DQorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX1NQRUM6DQorCQkJCXNldFNwZWMoU1BFQ19FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX05BTUU6DQorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fREVTQ1JJUFRJT046DQorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0tfX1RZUEU6DQorCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fU1BFQzoNCisJCQkJcmV0dXJuIFNQRUNfRURFRkFVTFQgPT0gbnVsbCA/IHNwZWMgIT0gbnVsbCA6ICFTUEVDX0VERUZBVUxULmVxdWFscyhzcGVjKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7DQorCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaWJlZEVsZW1lbnQuY2xhc3MpIHsNCisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsNCisJCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTl9DSEVDS19fREVTQ1JJUFRJT046IHJldHVybiBDb21yZWxQYWNrYWdlLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTjsNCisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7DQorCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaWJlZEVsZW1lbnQuY2xhc3MpIHsNCisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsNCisJCQkJY2FzZSBDb21yZWxQYWNrYWdlLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTjogcmV0dXJuIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OX0NIRUNLX19ERVNDUklQVElPTjsNCisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChuYW1lKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7DQorCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZCh0eXBlKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgc3BlYzogIik7DQorCQlyZXN1bHQuYXBwZW5kKHNwZWMpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL0NvbmRpdGlvbkNoZWNrSW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0NvbmRpdGlvbmFsVW5pdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0NvbmRpdGlvbmFsVW5pdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQzY2FhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvQ29uZGl0aW9uYWxVbml0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDQ0IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuQ29uZGl0aW9uQ2hlY2s7DQoraW1wb3J0IGNvbXJlbC5Db25kaXRpb25hbFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuUmVmYWN0b3JpbmdVbml0Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZGl0aW9uYWwgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Db25kaXRpb25hbFVuaXRJbXBsI2dldElmIDxlbT5JZjwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNvbmRpdGlvbmFsVW5pdEltcGwjZ2V0SGVscGVyVW5pdHMgPGVtPkhlbHBlciBVbml0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNvbmRpdGlvbmFsVW5pdEltcGwjZ2V0VGhlbiA8ZW0+VGhlbjwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNvbmRpdGlvbmFsVW5pdEltcGwjZ2V0RWxzZSA8ZW0+RWxzZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkNvbmRpdGlvbmFsVW5pdEltcGwjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Db25kaXRpb25hbFVuaXRJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25kaXRpb25hbFVuaXRJbXBsIGV4dGVuZHMgQ29tcG9zaXRlVW5pdEltcGwgaW1wbGVtZW50cyBDb25kaXRpb25hbFVuaXQgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWYoKSA8ZW0+SWY8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldElmKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIENvbmRpdGlvbkNoZWNrIGlmXzsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlbHBlclVuaXRzKCkgPGVtPkhlbHBlciBVbml0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRIZWxwZXJVbml0cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFTGlzdDxIZWxwZXJVbml0PiBoZWxwZXJVbml0czsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRoZW4oKSA8ZW0+VGhlbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VGhlbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBSZWZhY3RvcmluZ1VuaXQgdGhlbjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsc2UoKSA8ZW0+RWxzZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0RWxzZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBSZWZhY3RvcmluZ1VuaXQgZWxzZV87DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnB1dFBvcnRzKCkgPGVtPklucHV0IFBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldElucHV0UG9ydHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8SW5wdXRQb3J0PiBpbnB1dFBvcnRzOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSAiQ29uZGl0aW9uYWwgVW5pdCI7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBDb25kaXRpb25hbFVuaXRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkNPTkRJVElPTkFMX1VOSVQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29uZGl0aW9uQ2hlY2sgZ2V0SWYoKSB7DQorCQlyZXR1cm4gaWZfOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SWYoQ29uZGl0aW9uQ2hlY2sgbmV3SWYsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCUNvbmRpdGlvbkNoZWNrIG9sZElmID0gaWZfOw0KKwkJaWZfID0gbmV3SWY7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19JRiwgb2xkSWYsIG5ld0lmKTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldElmKENvbmRpdGlvbkNoZWNrIG5ld0lmKSB7DQorCQlpZiAobmV3SWYgIT0gaWZfKSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKGlmXyAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaWZfKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19JRiwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld0lmICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJZikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSUYsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldElmKG5ld0lmLCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0lGLCBuZXdJZiwgbmV3SWYpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxIZWxwZXJVbml0PiBnZXRIZWxwZXJVbml0cygpIHsNCisJCWlmIChoZWxwZXJVbml0cyA9PSBudWxsKSB7DQorCQkJaGVscGVyVW5pdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SGVscGVyVW5pdD4oSGVscGVyVW5pdC5jbGFzcywgdGhpcywgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19IRUxQRVJfVU5JVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIGhlbHBlclVuaXRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFJlZmFjdG9yaW5nVW5pdCBnZXRUaGVuKCkgew0KKwkJcmV0dXJuIHRoZW47DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUaGVuKFJlZmFjdG9yaW5nVW5pdCBuZXdUaGVuLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlSZWZhY3RvcmluZ1VuaXQgb2xkVGhlbiA9IHRoZW47DQorCQl0aGVuID0gbmV3VGhlbjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4sIG9sZFRoZW4sIG5ld1RoZW4pOw0KKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJCXJldHVybiBtc2dzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0VGhlbihSZWZhY3RvcmluZ1VuaXQgbmV3VGhlbikgew0KKwkJaWYgKG5ld1RoZW4gIT0gdGhlbikgew0KKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOw0KKwkJCWlmICh0aGVuICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0aGVuKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19USEVOLCBudWxsLCBtc2dzKTsNCisJCQlpZiAobmV3VGhlbiAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGhlbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fVEhFTiwgbnVsbCwgbXNncyk7DQorCQkJbXNncyA9IGJhc2ljU2V0VGhlbihuZXdUaGVuLCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX1RIRU4sIG5ld1RoZW4sIG5ld1RoZW4pKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSZWZhY3RvcmluZ1VuaXQgZ2V0RWxzZSgpIHsNCisJCXJldHVybiBlbHNlXzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVsc2UoUmVmYWN0b3JpbmdVbml0IG5ld0Vsc2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCVJlZmFjdG9yaW5nVW5pdCBvbGRFbHNlID0gZWxzZV87DQorCQllbHNlXyA9IG5ld0Vsc2U7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19FTFNFLCBvbGRFbHNlLCBuZXdFbHNlKTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEVsc2UoUmVmYWN0b3JpbmdVbml0IG5ld0Vsc2UpIHsNCisJCWlmIChuZXdFbHNlICE9IGVsc2VfKSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKGVsc2VfICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllbHNlXykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fRUxTRSwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld0Vsc2UgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0Vsc2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0VMU0UsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldEVsc2UobmV3RWxzZSwgbXNncyk7DQorCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOw0KKwkJfQ0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19FTFNFLCBuZXdFbHNlLCBuZXdFbHNlKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUxpc3Q8SW5wdXRQb3J0PiBnZXRJbnB1dFBvcnRzKCkgew0KKwkJaWYgKGlucHV0UG9ydHMgPT0gbnVsbCkgew0KKwkJCWlucHV0UG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SW5wdXRQb3J0PihJbnB1dFBvcnQuY2xhc3MsIHRoaXMsIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSU5QVVRfUE9SVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIGlucHV0UG9ydHM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7DQorCQlyZXR1cm4gdHlwZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19JRjoNCisJCQkJcmV0dXJuIGJhc2ljU2V0SWYobnVsbCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIZWxwZXJVbml0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX1RIRU46DQorCQkJCXJldHVybiBiYXNpY1NldFRoZW4obnVsbCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0VMU0U6DQorCQkJCXJldHVybiBiYXNpY1NldEVsc2UobnVsbCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldElucHV0UG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0lGOg0KKwkJCQlyZXR1cm4gZ2V0SWYoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCQlyZXR1cm4gZ2V0SGVscGVyVW5pdHMoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fVEhFTjoNCisJCQkJcmV0dXJuIGdldFRoZW4oKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fRUxTRToNCisJCQkJcmV0dXJuIGdldEVsc2UoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiBnZXRJbnB1dFBvcnRzKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX1RZUEU6DQorCQkJCXJldHVybiBnZXRUeXBlKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0lGOg0KKwkJCQlzZXRJZigoQ29uZGl0aW9uQ2hlY2spbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJZ2V0SGVscGVyVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlnZXRIZWxwZXJVbml0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSGVscGVyVW5pdD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX1RIRU46DQorCQkJCXNldFRoZW4oKFJlZmFjdG9yaW5nVW5pdCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fRUxTRToNCisJCQkJc2V0RWxzZSgoUmVmYWN0b3JpbmdVbml0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19JTlBVVF9QT1JUUzoNCisJCQkJZ2V0SW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCWdldElucHV0UG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElucHV0UG9ydD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19JRjoNCisJCQkJc2V0SWYoKENvbmRpdGlvbkNoZWNrKW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJZ2V0SGVscGVyVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVRfX1RIRU46DQorCQkJCXNldFRoZW4oKFJlZmFjdG9yaW5nVW5pdCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19FTFNFOg0KKwkJCQlzZXRFbHNlKChSZWZhY3RvcmluZ1VuaXQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSU5QVVRfUE9SVFM6DQorCQkJCWdldElucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSUY6DQorCQkJCXJldHVybiBpZl8gIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCQlyZXR1cm4gaGVscGVyVW5pdHMgIT0gbnVsbCAmJiAhaGVscGVyVW5pdHMuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19USEVOOg0KKwkJCQlyZXR1cm4gdGhlbiAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19FTFNFOg0KKwkJCQlyZXR1cm4gZWxzZV8gIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuQ09ORElUSU9OQUxfVU5JVF9fSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiBpbnB1dFBvcnRzICE9IG51bGwgJiYgIWlucHV0UG9ydHMuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05BTF9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKHR5cGUpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL0NvbmRpdGlvbmFsVW5pdEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9GZWF0dXJlSGVscGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvRmVhdHVyZUhlbHBlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VhNjFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvRmVhdHVyZUhlbHBlckltcGwuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZlYXR1cmUgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkZlYXR1cmVIZWxwZXJJbXBsI2dldElucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkZlYXR1cmVIZWxwZXJJbXBsI2dldFNlY29uZGFyeUlucHV0UG9ydHMgPGVtPlNlY29uZGFyeSBJbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVIZWxwZXJJbXBsIGV4dGVuZHMgSGVscGVySW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVIZWxwZXIgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5wdXRQb3J0KCkgPGVtPklucHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldElucHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVJbnB1dFBvcnQgaW5wdXRQb3J0Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpIDxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFTGlzdDxNdWx0aUlucHV0UG9ydD4gc2Vjb25kYXJ5SW5wdXRQb3J0czsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRmVhdHVyZUhlbHBlckltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuRkVBVFVSRV9IRUxQRVI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0IGdldElucHV0UG9ydCgpIHsNCisJCXJldHVybiBpbnB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IG5ld0lucHV0UG9ydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJU2luZ2xlSW5wdXRQb3J0IG9sZElucHV0UG9ydCA9IGlucHV0UG9ydDsNCisJCWlucHV0UG9ydCA9IG5ld0lucHV0UG9ydDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkZFQVRVUkVfSEVMUEVSX19JTlBVVF9QT1JULCBvbGRJbnB1dFBvcnQsIG5ld0lucHV0UG9ydCk7DQorCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOw0KKwkJfQ0KKwkJcmV0dXJuIG1zZ3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IG5ld0lucHV0UG9ydCkgew0KKwkJaWYgKG5ld0lucHV0UG9ydCAhPSBpbnB1dFBvcnQpIHsNCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCisJCQlpZiAoaW5wdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLkZFQVRVUkVfSEVMUEVSX19JTlBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQlpZiAobmV3SW5wdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnB1dFBvcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLkZFQVRVUkVfSEVMUEVSX19JTlBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRJbnB1dFBvcnQobmV3SW5wdXRQb3J0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkZFQVRVUkVfSEVMUEVSX19JTlBVVF9QT1JULCBuZXdJbnB1dFBvcnQsIG5ld0lucHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PE11bHRpSW5wdXRQb3J0PiBnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkgew0KKwkJaWYgKHNlY29uZGFyeUlucHV0UG9ydHMgPT0gbnVsbCkgew0KKwkJCXNlY29uZGFyeUlucHV0UG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TXVsdGlJbnB1dFBvcnQ+KE11bHRpSW5wdXRQb3J0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLkZFQVRVUkVfSEVMUEVSX19TRUNPTkRBUllfSU5QVVRfUE9SVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIHNlY29uZGFyeUlucHV0UG9ydHM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRkVBVFVSRV9IRUxQRVJfX0lOUFVUX1BPUlQ6DQorCQkJCXJldHVybiBiYXNpY1NldElucHV0UG9ydChudWxsLCBtc2dzKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRkVBVFVSRV9IRUxQRVJfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GRUFUVVJFX0hFTFBFUl9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGdldElucHV0UG9ydCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GRUFUVVJFX0hFTFBFUl9fSU5QVVRfUE9SVDoNCisJCQkJc2V0SW5wdXRQb3J0KChTaW5nbGVJbnB1dFBvcnQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkZFQVRVUkVfSEVMUEVSX19TRUNPTkRBUllfSU5QVVRfUE9SVFM6DQorCQkJCWdldFNlY29uZGFyeUlucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNdWx0aUlucHV0UG9ydD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GRUFUVVJFX0hFTFBFUl9fSU5QVVRfUE9SVDoNCisJCQkJc2V0SW5wdXRQb3J0KChTaW5nbGVJbnB1dFBvcnQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRkVBVFVSRV9IRUxQRVJfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzoNCisJCQkJZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GRUFUVVJFX0hFTFBFUl9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGlucHV0UG9ydCAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GRUFUVVJFX0hFTFBFUl9fU0VDT05EQVJZX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gc2Vjb25kYXJ5SW5wdXRQb3J0cyAhPSBudWxsICYmICFzZWNvbmRhcnlJbnB1dFBvcnRzLmlzRW1wdHkoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KK30gLy9GZWF0dXJlSGVscGVySW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0ZlYXR1cmVVbml0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvRmVhdHVyZVVuaXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwZTliMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0ZlYXR1cmVVbml0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5GZWF0dXJlVW5pdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GZWF0dXJlIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmVhdHVyZVVuaXRJbXBsIGV4dGVuZHMgSGVscGVyVW5pdEltcGwgaW1wbGVtZW50cyBGZWF0dXJlVW5pdCB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEZlYXR1cmVVbml0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5GRUFUVVJFX1VOSVQ7DQorCX0NCisNCit9IC8vRmVhdHVyZVVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvRmlsdGVySGVscGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvRmlsdGVySGVscGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTNiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9GaWx0ZXJIZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5GaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsdGVyIEhlbHBlcjwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5GaWx0ZXJIZWxwZXJJbXBsI2dldElucHV0UG9ydCA8ZW0+SW5wdXQgUG9ydDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlckhlbHBlckltcGwgZXh0ZW5kcyBIZWxwZXJJbXBsIGltcGxlbWVudHMgRmlsdGVySGVscGVyIHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElucHV0UG9ydCgpIDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRJbnB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlJbnB1dFBvcnQgaW5wdXRQb3J0Ow0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXJJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9IRUxQRVI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCkgew0KKwkJcmV0dXJuIGlucHV0UG9ydDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldElucHV0UG9ydChNdWx0aUlucHV0UG9ydCBuZXdJbnB1dFBvcnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCU11bHRpSW5wdXRQb3J0IG9sZElucHV0UG9ydCA9IGlucHV0UG9ydDsNCisJCWlucHV0UG9ydCA9IG5ld0lucHV0UG9ydDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkZJTFRFUl9IRUxQRVJfX0lOUFVUX1BPUlQsIG9sZElucHV0UG9ydCwgbmV3SW5wdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldElucHV0UG9ydChNdWx0aUlucHV0UG9ydCBuZXdJbnB1dFBvcnQpIHsNCisJCWlmIChuZXdJbnB1dFBvcnQgIT0gaW5wdXRQb3J0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKGlucHV0UG9ydCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5wdXRQb3J0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5GSUxURVJfSEVMUEVSX19JTlBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQlpZiAobmV3SW5wdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnB1dFBvcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLkZJTFRFUl9IRUxQRVJfX0lOUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldElucHV0UG9ydChuZXdJbnB1dFBvcnQsIG1zZ3MpOw0KKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsNCisJCX0NCisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVCwgbmV3SW5wdXRQb3J0LCBuZXdJbnB1dFBvcnQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GSUxURVJfSEVMUEVSX19JTlBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gYmFzaWNTZXRJbnB1dFBvcnQobnVsbCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGdldElucHV0UG9ydCgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkZJTFRFUl9IRUxQRVJfX0lOUFVUX1BPUlQ6DQorCQkJCXNldElucHV0UG9ydCgoTXVsdGlJbnB1dFBvcnQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GSUxURVJfSEVMUEVSX19JTlBVVF9QT1JUOg0KKwkJCQlzZXRJbnB1dFBvcnQoKE11bHRpSW5wdXRQb3J0KW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRklMVEVSX0hFTFBFUl9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGlucHV0UG9ydCAhPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorfSAvL0ZpbHRlckhlbHBlckltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9GaWx0ZXJVbml0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvRmlsdGVyVW5pdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGVhNGZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvRmlsdGVyVW5pdEltcGwuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuRmlsdGVyVW5pdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWx0ZXIgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJVbml0SW1wbCBleHRlbmRzIEhlbHBlclVuaXRJbXBsIGltcGxlbWVudHMgRmlsdGVyVW5pdCB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEZpbHRlclVuaXRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9VTklUOw0KKwl9DQorDQorfSAvL0ZpbHRlclVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvSGVscGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvSGVscGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzUzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9IZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5EZXNjcmliZWRFbGVtZW50Ow0KK2ltcG9ydCBjb21yZWwuSGVscGVyOw0KK2ltcG9ydCBjb21yZWwudXRpbC5Db21yZWxVdGlsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWxwZXI8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuSGVscGVySW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuSGVscGVySW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5IZWxwZXJJbXBsI2dldEhlbHBlcklkIDxlbT5IZWxwZXIgSWQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5IZWxwZXJJbXBsI2dldE5hbWVzcGFjZVVyaSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEhlbHBlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEhlbHBlciB7DQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWxwZXJJZCgpIDxlbT5IZWxwZXIgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEhlbHBlcklkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUEVSX0lEX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlbHBlcklkKCkgPGVtPkhlbHBlciBJZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0SGVscGVySWQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGhlbHBlcklkID0gSEVMUEVSX0lEX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVyaSgpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVyaSgpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVyaSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEhlbHBlckltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuSEVMUEVSOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKwkJcmV0dXJuIG5hbWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQorCQlpZiAoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpKSB7DQorCQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOw0KKwkJCW5hbWUgPSBuZXdOYW1lOw0KKwkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5IRUxQRVJfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7DQorCQlyZXR1cm4gZGVzY3JpcHRpb247DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsNCisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkhFTFBFUl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRIZWxwZXJJZCgpIHsNCisJCXJldHVybiBoZWxwZXJJZDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldEhlbHBlcklkKFN0cmluZyBuZXdIZWxwZXJJZCkgew0KKwkJaWYgKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSkgew0KKwkJCVN0cmluZyBvbGRIZWxwZXJJZCA9IGhlbHBlcklkOw0KKwkJCWhlbHBlcklkID0gbmV3SGVscGVySWQ7DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkhFTFBFUl9fSEVMUEVSX0lELCBvbGRIZWxwZXJJZCwgaGVscGVySWQpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCkgew0KKwkJcmV0dXJuIG5hbWVzcGFjZVVyaTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVyaShTdHJpbmcgbmV3TmFtZXNwYWNlVXJpKSB7DQorCQlTdHJpbmcgb2xkTmFtZXNwYWNlVXJpID0gbmFtZXNwYWNlVXJpOw0KKwkJbmFtZXNwYWNlVXJpID0gbmV3TmFtZXNwYWNlVXJpOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuSEVMUEVSX19OQU1FU1BBQ0VfVVJJLCBvbGROYW1lc3BhY2VVcmksIG5hbWVzcGFjZVVyaSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fTkFNRToNCisJCQkJcmV0dXJuIGdldE5hbWUoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX19ERVNDUklQVElPTjoNCisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fSEVMUEVSX0lEOg0KKwkJCQlyZXR1cm4gZ2V0SGVscGVySWQoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX19OQU1FU1BBQ0VfVVJJOg0KKwkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlVXJpKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX19OQU1FOg0KKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fREVTQ1JJUFRJT046DQorCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fSEVMUEVSX0lEOg0KKwkJCQlzZXRIZWxwZXJJZCgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfX05BTUVTUEFDRV9VUkk6DQorCQkJCXNldE5hbWVzcGFjZVVyaSgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX19OQU1FOg0KKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fREVTQ1JJUFRJT046DQorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfX0hFTFBFUl9JRDoNCisJCQkJc2V0SGVscGVySWQoSEVMUEVSX0lEX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfX05BTUVTUEFDRV9VUkk6DQorCQkJCXNldE5hbWVzcGFjZVVyaShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fTkFNRToNCisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX19ERVNDUklQVElPTjoNCisJCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9fSEVMUEVSX0lEOg0KKwkJCQlyZXR1cm4gSEVMUEVSX0lEX0VERUZBVUxUID09IG51bGwgPyBoZWxwZXJJZCAhPSBudWxsIDogIUhFTFBFUl9JRF9FREVGQVVMVC5lcXVhbHMoaGVscGVySWQpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfX05BTUVTUEFDRV9VUkk6DQorCQkJCXJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVcmkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVcmkpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsNCisJCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpYmVkRWxlbWVudC5jbGFzcykgew0KKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgew0KKwkJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX19ERVNDUklQVElPTjogcmV0dXJuIENvbXJlbFBhY2thZ2UuREVTQ1JJQkVEX0VMRU1FTlRfX0RFU0NSSVBUSU9OOw0KKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsNCisJCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpYmVkRWxlbWVudC5jbGFzcykgew0KKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgew0KKwkJCQljYXNlIENvbXJlbFBhY2thZ2UuREVTQ1JJQkVEX0VMRU1FTlRfX0RFU0NSSVBUSU9OOiByZXR1cm4gQ29tcmVsUGFja2FnZS5IRUxQRVJfX0RFU0NSSVBUSU9OOw0KKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKG5hbWUpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7DQorCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgaGVscGVySWQ6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChoZWxwZXJJZCk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVyaTogIik7DQorCQlyZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVyaSk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCit9IC8vSGVscGVySW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL0hlbHBlclVuaXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9IZWxwZXJVbml0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYWFmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9IZWxwZXJVbml0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzkzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuRGVzY3JpYmVkRWxlbWVudDsNCitpbXBvcnQgY29tcmVsLkhlbHBlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5PdXRwdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwudXRpbC5Db21yZWxVdGlsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWxwZXIgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5IZWxwZXJVbml0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuSGVscGVyVW5pdEltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuSGVscGVyVW5pdEltcGwjZ2V0SGVscGVyVW5pdElkIDxlbT5IZWxwZXIgVW5pdCBJZDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLkhlbHBlclVuaXRJbXBsI2dldE5hbWVzcGFjZVVyaSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEhlbHBlclVuaXRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBIZWxwZXJVbml0IHsNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TmFtZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlbHBlclVuaXRJZCgpIDxlbT5IZWxwZXIgVW5pdCBJZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0SGVscGVyVW5pdElkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUEVSX1VOSVRfSURfRURFRkFVTFQgPSBudWxsOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVscGVyVW5pdElkKCkgPGVtPkhlbHBlciBVbml0IElkPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRIZWxwZXJVbml0SWQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGhlbHBlclVuaXRJZCA9IEhFTFBFUl9VTklUX0lEX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVyaSgpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVyaSgpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lc3BhY2VVcmkoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVyaSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEhlbHBlclVuaXRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLkhFTFBFUl9VTklUOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKwkJcmV0dXJuIG5hbWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQorCQlpZiAoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpKSB7DQorCQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOw0KKwkJCW5hbWUgPSBuZXdOYW1lOw0KKwkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCisJCXJldHVybiBkZXNjcmlwdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgew0KKwkJaWYgKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSkgew0KKwkJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KKwkJCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkhFTFBFUl9VTklUX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldEhlbHBlclVuaXRJZCgpIHsNCisJCXJldHVybiBoZWxwZXJVbml0SWQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRIZWxwZXJVbml0SWQoU3RyaW5nIG5ld0hlbHBlclVuaXRJZCkgew0KKwkJaWYgKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSkgew0KKwkJCVN0cmluZyBvbGRIZWxwZXJVbml0SWQgPSBoZWxwZXJVbml0SWQ7DQorCQkJaGVscGVyVW5pdElkID0gbmV3SGVscGVyVW5pdElkOw0KKwkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fSEVMUEVSX1VOSVRfSUQsIG9sZEhlbHBlclVuaXRJZCwgaGVscGVyVW5pdElkKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpIHsNCisJCXJldHVybiBuYW1lc3BhY2VVcmk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVcmkoU3RyaW5nIG5ld05hbWVzcGFjZVVyaSkgew0KKwkJU3RyaW5nIG9sZE5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZVVyaTsNCisJCW5hbWVzcGFjZVVyaSA9IG5ld05hbWVzcGFjZVVyaTsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLkhFTFBFUl9VTklUX19OQU1FU1BBQ0VfVVJJLCBvbGROYW1lc3BhY2VVcmksIG5hbWVzcGFjZVVyaSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElucHV0UG9ydCBnZXRJbnB1dFBvcnQoKSB7DQorCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QNCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UDQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKSB7DQorCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QNCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UDQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fTkFNRToNCisJCQkJcmV0dXJuIGdldE5hbWUoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVRfX0RFU0NSSVBUSU9OOg0KKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVRfX0hFTFBFUl9VTklUX0lEOg0KKwkJCQlyZXR1cm4gZ2V0SGVscGVyVW5pdElkKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9VTklUX19OQU1FU1BBQ0VfVVJJOg0KKwkJCQlyZXR1cm4gZ2V0TmFtZXNwYWNlVXJpKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVRfX05BTUU6DQorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVRfX0RFU0NSSVBUSU9OOg0KKwkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fSEVMUEVSX1VOSVRfSUQ6DQorCQkJCXNldEhlbHBlclVuaXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fTkFNRVNQQUNFX1VSSToNCisJCQkJc2V0TmFtZXNwYWNlVXJpKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fTkFNRToNCisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fREVTQ1JJUFRJT046DQorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fSEVMUEVSX1VOSVRfSUQ6DQorCQkJCXNldEhlbHBlclVuaXRJZChIRUxQRVJfVU5JVF9JRF9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVRfX05BTUVTUEFDRV9VUkk6DQorCQkJCXNldE5hbWVzcGFjZVVyaShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9VTklUX19OQU1FOg0KKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fREVTQ1JJUFRJT046DQorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fSEVMUEVSX1VOSVRfSUQ6DQorCQkJCXJldHVybiBIRUxQRVJfVU5JVF9JRF9FREVGQVVMVCA9PSBudWxsID8gaGVscGVyVW5pdElkICE9IG51bGwgOiAhSEVMUEVSX1VOSVRfSURfRURFRkFVTFQuZXF1YWxzKGhlbHBlclVuaXRJZCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9VTklUX19OQU1FU1BBQ0VfVVJJOg0KKwkJCQlyZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVXJpICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVXJpKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7DQorCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaWJlZEVsZW1lbnQuY2xhc3MpIHsNCisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsNCisJCQkJY2FzZSBDb21yZWxQYWNrYWdlLkhFTFBFUl9VTklUX19ERVNDUklQVElPTjogcmV0dXJuIENvbXJlbFBhY2thZ2UuREVTQ1JJQkVEX0VMRU1FTlRfX0RFU0NSSVBUSU9OOw0KKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsNCisJCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpYmVkRWxlbWVudC5jbGFzcykgew0KKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgew0KKwkJCQljYXNlIENvbXJlbFBhY2thZ2UuREVTQ1JJQkVEX0VMRU1FTlRfX0RFU0NSSVBUSU9OOiByZXR1cm4gQ29tcmVsUGFja2FnZS5IRUxQRVJfVU5JVF9fREVTQ1JJUFRJT047DQorCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQobmFtZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBoZWxwZXJVbml0SWQ6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChoZWxwZXJVbml0SWQpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lc3BhY2VVcmk6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVcmkpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL0hlbHBlclVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvSW5wdXRQb3J0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvSW5wdXRQb3J0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTJhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9JbnB1dFBvcnRJbXBsLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLklucHV0UG9ydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbnB1dCBQb3J0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIElucHV0UG9ydEltcGwgZXh0ZW5kcyBQb3J0SW1wbCBpbXBsZW1lbnRzIElucHV0UG9ydCB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIElucHV0UG9ydEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuSU5QVVRfUE9SVDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBCb29sZWFuIGlzTWFwcGluZ1RhcmdldCgpIHsNCisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZA0KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEJvb2xlYW4gaXNSb290UG9ydCgpIHsNCisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZA0KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorfSAvL0lucHV0UG9ydEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Nb2RlbFJlZmFjdG9yaW5nSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTW9kZWxSZWZhY3RvcmluZ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2VmMDkyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTW9kZWxSZWZhY3RvcmluZ0ltcGwuamF2YQpAQCAtMCwwICsxLDQ4NSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkRlc2NyaWJlZEVsZW1lbnQ7DQoraW1wb3J0IGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwudXRpbC5Db21yZWxVdGlsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1vZGVsIFJlZmFjdG9yaW5nPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLk1vZGVsUmVmYWN0b3JpbmdJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Nb2RlbFJlZmFjdG9yaW5nSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Nb2RlbFJlZmFjdG9yaW5nSW1wbCNnZXRSZWZJZCA8ZW0+UmVmIElkPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuTW9kZWxSZWZhY3RvcmluZ0ltcGwjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuTW9kZWxSZWZhY3RvcmluZ0ltcGwjZ2V0TmFtZXNwYWNlVXJpIDxlbT5OYW1lc3BhY2UgVXJpPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuTW9kZWxSZWZhY3RvcmluZ0ltcGwjZ2V0SW5wdXRQb3J0cyA8ZW0+SW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNb2RlbFJlZmFjdG9yaW5nSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTW9kZWxSZWZhY3RvcmluZyB7DQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZJZCgpIDxlbT5SZWYgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFJlZklkKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGX0lEX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZklkKCkgPGVtPlJlZiBJZDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0UmVmSWQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlZklkID0gUkVGX0lEX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsKCkgPGVtPkxhYmVsPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsKCkgPGVtPkxhYmVsPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMYWJlbCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBMQUJFTF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVcmkoKSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TmFtZXNwYWNlVXJpKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVcmkoKSA8ZW0+TmFtZXNwYWNlIFVyaTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TmFtZXNwYWNlVXJpKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVcmkgPSBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5wdXRQb3J0cygpIDxlbT5JbnB1dCBQb3J0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRJbnB1dFBvcnRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PFNpbmdsZUlucHV0UG9ydD4gaW5wdXRQb3J0czsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTW9kZWxSZWZhY3RvcmluZ0ltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCXB1YmxpYyBNb2RlbFJlZmFjdG9yaW5nSW1wbChTdHJpbmcgaWQpIHsNCisJCXN1cGVyKCk7DQorCQl0aGlzLnJlZklkID0gaWQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NT0RFTF9SRUZBQ1RPUklORzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisJCXJldHVybiBuYW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgew0KKwkJaWYgKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSkgew0KKwkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsNCisJCQluYW1lID0gbmV3TmFtZTsNCisJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7DQorCQlyZXR1cm4gZGVzY3JpcHRpb247DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsNCisJCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KKwkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFJlZklkKCkgew0KKwkJcmV0dXJuIHJlZklkOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0UmVmSWQoU3RyaW5nIG5ld1JlZklkKSB7DQorCQlpZiAoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpKSB7DQorCQkJU3RyaW5nIG9sZFJlZklkID0gcmVmSWQ7DQorCQkJcmVmSWQgPSBuZXdSZWZJZDsNCisJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX1JFRl9JRCwgb2xkUmVmSWQsIHJlZklkKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgew0KKwkJcmV0dXJuIGxhYmVsOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIG5ld0xhYmVsKSB7DQorCQlpZiAoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpKSB7DQorCQkJU3RyaW5nIG9sZExhYmVsID0gbGFiZWw7DQorCQkJbGFiZWwgPSBuZXdMYWJlbDsNCisJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX0xBQkVMLCBvbGRMYWJlbCwgbGFiZWwpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCkgew0KKwkJcmV0dXJuIG5hbWVzcGFjZVVyaTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVyaShTdHJpbmcgbmV3TmFtZXNwYWNlVXJpKSB7DQorCQlpZiAoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpKSB7DQorCQkJU3RyaW5nIG9sZE5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZVVyaTsNCisJCQluYW1lc3BhY2VVcmkgPSBuZXdOYW1lc3BhY2VVcmk7DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19OQU1FU1BBQ0VfVVJJLCBvbGROYW1lc3BhY2VVcmksIG5hbWVzcGFjZVVyaSkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PFNpbmdsZUlucHV0UG9ydD4gZ2V0SW5wdXRQb3J0cygpIHsNCisJCWlmIChpbnB1dFBvcnRzID09IG51bGwpIHsNCisJCQlpbnB1dFBvcnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNpbmdsZUlucHV0UG9ydD4oU2luZ2xlSW5wdXRQb3J0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19JTlBVVF9QT1JUUyk7DQorCQl9DQorCQlyZXR1cm4gaW5wdXRQb3J0czsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5wdXRQb3J0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX05BTUU6DQorCQkJCXJldHVybiBnZXROYW1lKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19ERVNDUklQVElPTjoNCisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19SRUZfSUQ6DQorCQkJCXJldHVybiBnZXRSZWZJZCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTEFCRUw6DQorCQkJCXJldHVybiBnZXRMYWJlbCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTkFNRVNQQUNFX1VSSToNCisJCQkJcmV0dXJuIGdldE5hbWVzcGFjZVVyaSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiBnZXRJbnB1dFBvcnRzKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19OQU1FOg0KKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19ERVNDUklQVElPTjoNCisJCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX1JFRl9JRDoNCisJCQkJc2V0UmVmSWQoKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX0xBQkVMOg0KKwkJCQlzZXRMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTkFNRVNQQUNFX1VSSToNCisJCQkJc2V0TmFtZXNwYWNlVXJpKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19JTlBVVF9QT1JUUzoNCisJCQkJZ2V0SW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCWdldElucHV0UG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNpbmdsZUlucHV0UG9ydD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTkFNRToNCisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fREVTQ1JJUFRJT046DQorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fUkVGX0lEOg0KKwkJCQlzZXRSZWZJZChSRUZfSURfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19MQUJFTDoNCisJCQkJc2V0TGFiZWwoTEFCRUxfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19OQU1FU1BBQ0VfVVJJOg0KKwkJCQlzZXROYW1lc3BhY2VVcmkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX0lOUFVUX1BPUlRTOg0KKwkJCQlnZXRJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19OQU1FOg0KKwkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fREVTQ1JJUFRJT046DQorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fUkVGX0lEOg0KKwkJCQlyZXR1cm4gUkVGX0lEX0VERUZBVUxUID09IG51bGwgPyByZWZJZCAhPSBudWxsIDogIVJFRl9JRF9FREVGQVVMVC5lcXVhbHMocmVmSWQpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTEFCRUw6DQorCQkJCXJldHVybiBMQUJFTF9FREVGQVVMVCA9PSBudWxsID8gbGFiZWwgIT0gbnVsbCA6ICFMQUJFTF9FREVGQVVMVC5lcXVhbHMobGFiZWwpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fTkFNRVNQQUNFX1VSSToNCisJCQkJcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVyaSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVyaSk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1PREVMX1JFRkFDVE9SSU5HX19JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIGlucHV0UG9ydHMgIT0gbnVsbCAmJiAhaW5wdXRQb3J0cy5pc0VtcHR5KCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgew0KKwkJaWYgKGJhc2VDbGFzcyA9PSBEZXNjcmliZWRFbGVtZW50LmNsYXNzKSB7DQorCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7DQorCQkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklOR19fREVTQ1JJUFRJT046IHJldHVybiBDb21yZWxQYWNrYWdlLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTjsNCisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7DQorCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaWJlZEVsZW1lbnQuY2xhc3MpIHsNCisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsNCisJCQkJY2FzZSBDb21yZWxQYWNrYWdlLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTjogcmV0dXJuIENvbXJlbFBhY2thZ2UuTU9ERUxfUkVGQUNUT1JJTkdfX0RFU0NSSVBUSU9OOw0KKwkJCQlkZWZhdWx0OiByZXR1cm4gLTE7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKG5hbWUpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7DQorCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsNCisJCXJlc3VsdC5hcHBlbmQoIiwgcmVmSWQ6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChyZWZJZCk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGxhYmVsOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQobGFiZWwpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lc3BhY2VVcmk6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVcmkpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL01vZGVsUmVmYWN0b3JpbmdJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTXVsdGlGZWF0dXJlSGVscGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTXVsdGlGZWF0dXJlSGVscGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGFmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aUZlYXR1cmVIZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5NdWx0aU91dHB1dFBvcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIEZlYXR1cmUgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpRmVhdHVyZUhlbHBlckltcGwjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZlYXR1cmVIZWxwZXJJbXBsIGV4dGVuZHMgRmVhdHVyZUhlbHBlckltcGwgaW1wbGVtZW50cyBNdWx0aUZlYXR1cmVIZWxwZXIgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0UG9ydCgpIDxlbT5PdXRwdXQgUG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aU91dHB1dFBvcnQgb3V0cHV0UG9ydDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlGZWF0dXJlSGVscGVySW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9GRUFUVVJFX0hFTFBFUjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aU91dHB1dFBvcnQgZ2V0T3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiBvdXRwdXRQb3J0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQgbmV3T3V0cHV0UG9ydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJTXVsdGlPdXRwdXRQb3J0IG9sZE91dHB1dFBvcnQgPSBvdXRwdXRQb3J0Ow0KKwkJb3V0cHV0UG9ydCA9IG5ld091dHB1dFBvcnQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQsIG9sZE91dHB1dFBvcnQsIG5ld091dHB1dFBvcnQpOw0KKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJCXJldHVybiBtc2dzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQgbmV3T3V0cHV0UG9ydCkgew0KKwkJaWYgKG5ld091dHB1dFBvcnQgIT0gb3V0cHV0UG9ydCkgew0KKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOw0KKwkJCWlmIChvdXRwdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvdXRwdXRQb3J0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdPdXRwdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPdXRwdXRQb3J0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldE91dHB1dFBvcnQobmV3T3V0cHV0UG9ydCwgbXNncyk7DQorCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOw0KKwkJfQ0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQsIG5ld091dHB1dFBvcnQsIG5ld091dHB1dFBvcnQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBiYXNpY1NldE91dHB1dFBvcnQobnVsbCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gZ2V0T3V0cHV0UG9ydCgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoTXVsdGlPdXRwdXRQb3J0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlzZXRPdXRwdXRQb3J0KChNdWx0aU91dHB1dFBvcnQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBvdXRwdXRQb3J0ICE9IG51bGw7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCit9IC8vTXVsdGlGZWF0dXJlSGVscGVySW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpRmVhdHVyZVVuaXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aUZlYXR1cmVVbml0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWVhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aUZlYXR1cmVVbml0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDIyIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlGZWF0dXJlVW5pdDsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlPdXRwdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwudXRpbC5Db21yZWxVdGlsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIEZlYXR1cmUgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5NdWx0aUZlYXR1cmVVbml0SW1wbCNnZXRJbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5NdWx0aUZlYXR1cmVVbml0SW1wbCNnZXRTZWNvbmRhcnlJbnB1dFBvcnRzIDxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5NdWx0aUZlYXR1cmVVbml0SW1wbCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpRmVhdHVyZVVuaXRJbXBsI2dldE11bHRpRmVhdHVyZUhlbHBlciA8ZW0+TXVsdGkgRmVhdHVyZSBIZWxwZXI8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5NdWx0aUZlYXR1cmVVbml0SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlGZWF0dXJlVW5pdEltcGwgZXh0ZW5kcyBGZWF0dXJlVW5pdEltcGwgaW1wbGVtZW50cyBNdWx0aUZlYXR1cmVVbml0IHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElucHV0UG9ydCgpIDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRJbnB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlSW5wdXRQb3J0IGlucHV0UG9ydDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY29uZGFyeUlucHV0UG9ydHMoKSA8ZW0+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNlY29uZGFyeUlucHV0UG9ydHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8TXVsdGlJbnB1dFBvcnQ+IHNlY29uZGFyeUlucHV0UG9ydHM7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRwdXRQb3J0KCkgPGVtPk91dHB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRPdXRwdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE11bHRpT3V0cHV0UG9ydCBvdXRwdXRQb3J0Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXVsdGlGZWF0dXJlSGVscGVyKCkgPGVtPk11bHRpIEZlYXR1cmUgSGVscGVyPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRNdWx0aUZlYXR1cmVIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlGZWF0dXJlSGVscGVyIG11bHRpRmVhdHVyZUhlbHBlcjsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gIk11bHRpIEZlYXR1cmUgVW5pdCI7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUZlYXR1cmVVbml0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJcHVibGljIE11bHRpRmVhdHVyZVVuaXRJbXBsKE11bHRpRmVhdHVyZUhlbHBlciBoZWxwZXIpIHsNCisJCXRoaXMubXVsdGlGZWF0dXJlSGVscGVyID0gaGVscGVyOw0KKwkJdGhpcy5uYW1lID0gaGVscGVyLmdldE5hbWUoKTsNCisJCXRoaXMuaGVscGVyVW5pdElkID0gaGVscGVyLmdldEhlbHBlcklkKCk7DQorCQl0aGlzLmRlc2NyaXB0aW9uID0gaGVscGVyLmdldERlc2NyaXB0aW9uKCk7DQorCQl0aGlzLm5hbWVzcGFjZVVyaSA9IGhlbHBlci5nZXROYW1lc3BhY2VVcmkoKTsNCisJCVNpbmdsZUlucHV0UG9ydCBpbnB1dFBvcnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKTsNCisJCU11bHRpT3V0cHV0UG9ydCBvdXRwdXRQb3J0ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCk7DQorCQlpbnB1dFBvcnQuc2V0RGVzY3JpcHRpb24oaGVscGVyLmdldElucHV0UG9ydCgpLmdldERlc2NyaXB0aW9uKCkpOw0KKwkJaW5wdXRQb3J0LnNldE5hbWUoaGVscGVyLmdldElucHV0UG9ydCgpLmdldE5hbWUoKSk7DQorCQlpbnB1dFBvcnQuc2V0VHlwZShoZWxwZXIuZ2V0SW5wdXRQb3J0KCkuZ2V0VHlwZSgpKTsNCisNCisJCXRoaXMuc2V0SW5wdXRQb3J0KGlucHV0UG9ydCk7DQorCQlvdXRwdXRQb3J0LnNldERlc2NyaXB0aW9uKGhlbHBlci5nZXRPdXRwdXRQb3J0KCkuZ2V0RGVzY3JpcHRpb24oKSk7DQorCQlvdXRwdXRQb3J0LnNldE5hbWUoaGVscGVyLmdldE91dHB1dFBvcnQoKS5nZXROYW1lKCkpOw0KKwkJb3V0cHV0UG9ydC5zZXRUeXBlKGhlbHBlci5nZXRPdXRwdXRQb3J0KCkuZ2V0VHlwZSgpKTsNCisNCisJCXRoaXMuc2V0T3V0cHV0UG9ydChvdXRwdXRQb3J0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0ZFQVRVUkVfVU5JVDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQgZ2V0SW5wdXRQb3J0KCkgew0KKwkJcmV0dXJuIGlucHV0UG9ydDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldElucHV0UG9ydChTaW5nbGVJbnB1dFBvcnQgbmV3SW5wdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlTaW5nbGVJbnB1dFBvcnQgb2xkSW5wdXRQb3J0ID0gaW5wdXRQb3J0Ow0KKwkJaW5wdXRQb3J0ID0gbmV3SW5wdXRQb3J0Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7DQorCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JULCBvbGRJbnB1dFBvcnQsIG5ld0lucHV0UG9ydCk7DQorCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOw0KKwkJfQ0KKwkJcmV0dXJuIG1zZ3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IG5ld0lucHV0UG9ydCkgew0KKwkJaWYgKG5ld0lucHV0UG9ydCAhPSBpbnB1dFBvcnQpIHsNCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCisJCQlpZiAoaW5wdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld0lucHV0UG9ydCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5wdXRQb3J0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldElucHV0UG9ydChuZXdJbnB1dFBvcnQsIG1zZ3MpOw0KKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsNCisJCX0NCisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JULCBuZXdJbnB1dFBvcnQsIG5ld0lucHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PE11bHRpSW5wdXRQb3J0PiBnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkgew0KKwkJaWYgKHNlY29uZGFyeUlucHV0UG9ydHMgPT0gbnVsbCkgew0KKwkJCXNlY29uZGFyeUlucHV0UG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TXVsdGlJbnB1dFBvcnQ+KE11bHRpSW5wdXRQb3J0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fU0VDT05EQVJZX0lOUFVUX1BPUlRTKTsNCisJCX0NCisJCXJldHVybiBzZWNvbmRhcnlJbnB1dFBvcnRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIG91dHB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPdXRwdXRQb3J0KE11bHRpT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlNdWx0aU91dHB1dFBvcnQgb2xkT3V0cHV0UG9ydCA9IG91dHB1dFBvcnQ7DQorCQlvdXRwdXRQb3J0ID0gbmV3T3V0cHV0UG9ydDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQsIG9sZE91dHB1dFBvcnQsIG5ld091dHB1dFBvcnQpOw0KKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJCXJldHVybiBtc2dzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQgbmV3T3V0cHV0UG9ydCkgew0KKwkJaWYgKG5ld091dHB1dFBvcnQgIT0gb3V0cHV0UG9ydCkgew0KKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOw0KKwkJCWlmIChvdXRwdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvdXRwdXRQb3J0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQlpZiAobmV3T3V0cHV0UG9ydCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3V0cHV0UG9ydCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJbXNncyA9IGJhc2ljU2V0T3V0cHV0UG9ydChuZXdPdXRwdXRQb3J0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQsIG5ld091dHB1dFBvcnQsIG5ld091dHB1dFBvcnQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVIZWxwZXIgZ2V0TXVsdGlGZWF0dXJlSGVscGVyKCkgew0KKwkJaWYgKG11bHRpRmVhdHVyZUhlbHBlciAhPSBudWxsICYmIG11bHRpRmVhdHVyZUhlbHBlci5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZE11bHRpRmVhdHVyZUhlbHBlciA9IChJbnRlcm5hbEVPYmplY3QpbXVsdGlGZWF0dXJlSGVscGVyOw0KKwkJCW11bHRpRmVhdHVyZUhlbHBlciA9IChNdWx0aUZlYXR1cmVIZWxwZXIpZVJlc29sdmVQcm94eShvbGRNdWx0aUZlYXR1cmVIZWxwZXIpOw0KKwkJCWlmIChtdWx0aUZlYXR1cmVIZWxwZXIgIT0gb2xkTXVsdGlGZWF0dXJlSGVscGVyKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fTVVMVElfRkVBVFVSRV9IRUxQRVIsIG9sZE11bHRpRmVhdHVyZUhlbHBlciwgbXVsdGlGZWF0dXJlSGVscGVyKSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIG11bHRpRmVhdHVyZUhlbHBlcjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUZlYXR1cmVIZWxwZXIgYmFzaWNHZXRNdWx0aUZlYXR1cmVIZWxwZXIoKSB7DQorCQlyZXR1cm4gbXVsdGlGZWF0dXJlSGVscGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TXVsdGlGZWF0dXJlSGVscGVyKE11bHRpRmVhdHVyZUhlbHBlciBuZXdNdWx0aUZlYXR1cmVIZWxwZXIpIHsNCisJCWlmKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSB8fCBtdWx0aUZlYXR1cmVIZWxwZXIgPT0gbnVsbCl7DQorCQkJTXVsdGlGZWF0dXJlSGVscGVyIG9sZE11bHRpRmVhdHVyZUhlbHBlciA9IG11bHRpRmVhdHVyZUhlbHBlcjsNCisJCQltdWx0aUZlYXR1cmVIZWxwZXIgPSBuZXdNdWx0aUZlYXR1cmVIZWxwZXI7DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fTVVMVElfRkVBVFVSRV9IRUxQRVIsIG9sZE11bHRpRmVhdHVyZUhlbHBlciwgbXVsdGlGZWF0dXJlSGVscGVyKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7DQorCQlyZXR1cm4gdHlwZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQ6DQorCQkJCXJldHVybiBiYXNpY1NldElucHV0UG9ydChudWxsLCBtc2dzKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19TRUNPTkRBUllfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBiYXNpY1NldE91dHB1dFBvcnQobnVsbCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gZ2V0SW5wdXRQb3J0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fU0VDT05EQVJZX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX01VTFRJX0ZFQVRVUkVfSEVMUEVSOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE11bHRpRmVhdHVyZUhlbHBlcigpOw0KKwkJCQlyZXR1cm4gYmFzaWNHZXRNdWx0aUZlYXR1cmVIZWxwZXIoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQ6DQorCQkJCXNldElucHV0UG9ydCgoU2luZ2xlSW5wdXRQb3J0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzoNCisJCQkJZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCWdldFNlY29uZGFyeUlucHV0UG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE11bHRpSW5wdXRQb3J0PiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoTXVsdGlPdXRwdXRQb3J0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX01VTFRJX0ZFQVRVUkVfSEVMUEVSOg0KKwkJCQlzZXRNdWx0aUZlYXR1cmVIZWxwZXIoKE11bHRpRmVhdHVyZUhlbHBlciluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJc2V0SW5wdXRQb3J0KChTaW5nbGVJbnB1dFBvcnQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19TRUNPTkRBUllfSU5QVVRfUE9SVFM6DQorCQkJCWdldFNlY29uZGFyeUlucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQ6DQorCQkJCXNldE91dHB1dFBvcnQoKE11bHRpT3V0cHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX01VTFRJX0ZFQVRVUkVfSEVMUEVSOg0KKwkJCQlzZXRNdWx0aUZlYXR1cmVIZWxwZXIoKE11bHRpRmVhdHVyZUhlbHBlciludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGlucHV0UG9ydCAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIHNlY29uZGFyeUlucHV0UG9ydHMgIT0gbnVsbCAmJiAhc2Vjb25kYXJ5SW5wdXRQb3J0cy5pc0VtcHR5KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBvdXRwdXRQb3J0ICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZFQVRVUkVfVU5JVF9fTVVMVElfRkVBVFVSRV9IRUxQRVI6DQorCQkJCXJldHVybiBtdWx0aUZlYXR1cmVIZWxwZXIgIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKHR5cGUpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL011bHRpRmVhdHVyZVVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTXVsdGlGaWx0ZXJIZWxwZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aUZpbHRlckhlbHBlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY0ODJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTXVsdGlGaWx0ZXJIZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlcjsNCitpbXBvcnQgY29tcmVsLk11bHRpT3V0cHV0UG9ydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgRmlsdGVyIEhlbHBlcjwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5NdWx0aUZpbHRlckhlbHBlckltcGwjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlckhlbHBlckltcGwgZXh0ZW5kcyBGaWx0ZXJIZWxwZXJJbXBsIGltcGxlbWVudHMgTXVsdGlGaWx0ZXJIZWxwZXIgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0UG9ydCgpIDxlbT5PdXRwdXQgUG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aU91dHB1dFBvcnQgb3V0cHV0UG9ydDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlGaWx0ZXJIZWxwZXJJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0ZJTFRFUl9IRUxQRVI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKSB7DQorCQlyZXR1cm4gb3V0cHV0UG9ydDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE91dHB1dFBvcnQoTXVsdGlPdXRwdXRQb3J0IG5ld091dHB1dFBvcnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCU11bHRpT3V0cHV0UG9ydCBvbGRPdXRwdXRQb3J0ID0gb3V0cHV0UG9ydDsNCisJCW91dHB1dFBvcnQgPSBuZXdPdXRwdXRQb3J0Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7DQorCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX0hFTFBFUl9fT1VUUFVUX1BPUlQsIG9sZE91dHB1dFBvcnQsIG5ld091dHB1dFBvcnQpOw0KKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJCXJldHVybiBtc2dzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0T3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQgbmV3T3V0cHV0UG9ydCkgew0KKwkJaWYgKG5ld091dHB1dFBvcnQgIT0gb3V0cHV0UG9ydCkgew0KKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOw0KKwkJCWlmIChvdXRwdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvdXRwdXRQb3J0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld091dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dHB1dFBvcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRPdXRwdXRQb3J0KG5ld091dHB1dFBvcnQsIG1zZ3MpOw0KKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsNCisJCX0NCisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX0hFTFBFUl9fT1VUUFVUX1BPUlQsIG5ld091dHB1dFBvcnQsIG5ld091dHB1dFBvcnQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJcmV0dXJuIGJhc2ljU2V0T3V0cHV0UG9ydChudWxsLCBtc2dzKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJcmV0dXJuIGdldE91dHB1dFBvcnQoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoTXVsdGlPdXRwdXRQb3J0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX0hFTFBFUl9fT1VUUFVUX1BPUlQ6DQorCQkJCXNldE91dHB1dFBvcnQoKE11bHRpT3V0cHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gb3V0cHV0UG9ydCAhPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorfSAvL011bHRpRmlsdGVySGVscGVySW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpRmlsdGVyVW5pdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpRmlsdGVyVW5pdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU2NDcwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTXVsdGlGaWx0ZXJVbml0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzc5IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlcjsNCitpbXBvcnQgY29tcmVsLk11bHRpRmlsdGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlPdXRwdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwudXRpbC5Db21yZWxVdGlsOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIEZpbHRlciBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpRmlsdGVyVW5pdEltcGwjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuTXVsdGlGaWx0ZXJVbml0SW1wbCNnZXRPdXRwdXRQb3J0IDxlbT5PdXRwdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpRmlsdGVyVW5pdEltcGwjZ2V0TXVsdGlGaWx0ZXJIZWxwZXIgPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5NdWx0aUZpbHRlclVuaXRJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aUZpbHRlclVuaXRJbXBsIGV4dGVuZHMgRmlsdGVyVW5pdEltcGwgaW1wbGVtZW50cyBNdWx0aUZpbHRlclVuaXQgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5wdXRQb3J0KCkgPGVtPklucHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldElucHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUlucHV0UG9ydCBpbnB1dFBvcnQ7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRwdXRQb3J0KCkgPGVtPk91dHB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRPdXRwdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE11bHRpT3V0cHV0UG9ydCBvdXRwdXRQb3J0Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoKSA8ZW0+TXVsdGkgRmlsdGVyIEhlbHBlcjwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TXVsdGlGaWx0ZXJIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlGaWx0ZXJIZWxwZXIgbXVsdGlGaWx0ZXJIZWxwZXI7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUeXBlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9ICJNdWx0aSBGaWx0ZXIgVW5pdCI7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aUZpbHRlclVuaXRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJVbml0SW1wbChNdWx0aUZpbHRlckhlbHBlciBoZWxwZXIpIHsNCisJCXRoaXMubXVsdGlGaWx0ZXJIZWxwZXIgPSBoZWxwZXI7DQorCQl0aGlzLmhlbHBlclVuaXRJZCA9IGhlbHBlci5nZXRIZWxwZXJJZCgpOw0KKwkJdGhpcy5uYW1lID0gaGVscGVyLmdldE5hbWUoKTsNCisJCXRoaXMuZGVzY3JpcHRpb24gPSBoZWxwZXIuZ2V0RGVzY3JpcHRpb24oKTsNCisJCXRoaXMubmFtZXNwYWNlVXJpID0gaGVscGVyLmdldE5hbWVzcGFjZVVyaSgpOw0KKwkJTXVsdGlJbnB1dFBvcnQgaW5wdXRQb3J0ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlJbnB1dFBvcnQoKTsNCisJCU11bHRpT3V0cHV0UG9ydCBvdXRwdXRQb3J0ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCk7DQorCQlpbnB1dFBvcnQuc2V0RGVzY3JpcHRpb24oaGVscGVyLmdldElucHV0UG9ydCgpLmdldERlc2NyaXB0aW9uKCkpOw0KKwkJaW5wdXRQb3J0LnNldE5hbWUoaGVscGVyLmdldElucHV0UG9ydCgpLmdldE5hbWUoKSk7DQorCQlpbnB1dFBvcnQuc2V0VHlwZShoZWxwZXIuZ2V0SW5wdXRQb3J0KCkuZ2V0VHlwZSgpKTsNCisNCisJCXRoaXMuc2V0SW5wdXRQb3J0KGlucHV0UG9ydCk7DQorCQlvdXRwdXRQb3J0LnNldERlc2NyaXB0aW9uKGhlbHBlci5nZXRPdXRwdXRQb3J0KCkuZ2V0RGVzY3JpcHRpb24oKSk7DQorCQlvdXRwdXRQb3J0LnNldE5hbWUoaGVscGVyLmdldE91dHB1dFBvcnQoKS5nZXROYW1lKCkpOw0KKwkJb3V0cHV0UG9ydC5zZXRUeXBlKGhlbHBlci5nZXRPdXRwdXRQb3J0KCkuZ2V0VHlwZSgpKTsNCisNCisJCXRoaXMuc2V0T3V0cHV0UG9ydChvdXRwdXRQb3J0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0ZJTFRFUl9VTklUOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0IGdldElucHV0UG9ydCgpIHsNCisJCXJldHVybiBpbnB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnB1dFBvcnQoTXVsdGlJbnB1dFBvcnQgbmV3SW5wdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlNdWx0aUlucHV0UG9ydCBvbGRJbnB1dFBvcnQgPSBpbnB1dFBvcnQ7DQorCQlpbnB1dFBvcnQgPSBuZXdJbnB1dFBvcnQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVCwgb2xkSW5wdXRQb3J0LCBuZXdJbnB1dFBvcnQpOw0KKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJCXJldHVybiBtc2dzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0SW5wdXRQb3J0KE11bHRpSW5wdXRQb3J0IG5ld0lucHV0UG9ydCkgew0KKwkJaWYgKG5ld0lucHV0UG9ydCAhPSBpbnB1dFBvcnQpIHsNCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCisJCQlpZiAoaW5wdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19JTlBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQlpZiAobmV3SW5wdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnB1dFBvcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19JTlBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRJbnB1dFBvcnQobmV3SW5wdXRQb3J0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19JTlBVVF9QT1JULCBuZXdJbnB1dFBvcnQsIG5ld0lucHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIG91dHB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPdXRwdXRQb3J0KE11bHRpT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlNdWx0aU91dHB1dFBvcnQgb2xkT3V0cHV0UG9ydCA9IG91dHB1dFBvcnQ7DQorCQlvdXRwdXRQb3J0ID0gbmV3T3V0cHV0UG9ydDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVCwgb2xkT3V0cHV0UG9ydCwgbmV3T3V0cHV0UG9ydCk7DQorCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOw0KKwkJfQ0KKwkJcmV0dXJuIG1zZ3M7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRPdXRwdXRQb3J0KE11bHRpT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0KSB7DQorCQlpZiAobmV3T3V0cHV0UG9ydCAhPSBvdXRwdXRQb3J0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKG91dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dHB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld091dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dHB1dFBvcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJbXNncyA9IGJhc2ljU2V0T3V0cHV0UG9ydChuZXdPdXRwdXRQb3J0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVCwgbmV3T3V0cHV0UG9ydCwgbmV3T3V0cHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpRmlsdGVySGVscGVyIGdldE11bHRpRmlsdGVySGVscGVyKCkgew0KKwkJaWYgKG11bHRpRmlsdGVySGVscGVyICE9IG51bGwgJiYgbXVsdGlGaWx0ZXJIZWxwZXIuZUlzUHJveHkoKSkgew0KKwkJCUludGVybmFsRU9iamVjdCBvbGRNdWx0aUZpbHRlckhlbHBlciA9IChJbnRlcm5hbEVPYmplY3QpbXVsdGlGaWx0ZXJIZWxwZXI7DQorCQkJbXVsdGlGaWx0ZXJIZWxwZXIgPSAoTXVsdGlGaWx0ZXJIZWxwZXIpZVJlc29sdmVQcm94eShvbGRNdWx0aUZpbHRlckhlbHBlcik7DQorCQkJaWYgKG11bHRpRmlsdGVySGVscGVyICE9IG9sZE11bHRpRmlsdGVySGVscGVyKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19NVUxUSV9GSUxURVJfSEVMUEVSLCBvbGRNdWx0aUZpbHRlckhlbHBlciwgbXVsdGlGaWx0ZXJIZWxwZXIpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gbXVsdGlGaWx0ZXJIZWxwZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlGaWx0ZXJIZWxwZXIgYmFzaWNHZXRNdWx0aUZpbHRlckhlbHBlcigpIHsNCisJCXJldHVybiBtdWx0aUZpbHRlckhlbHBlcjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE11bHRpRmlsdGVySGVscGVyKE11bHRpRmlsdGVySGVscGVyIG5ld011bHRpRmlsdGVySGVscGVyKSB7DQorCQlpZihDb21yZWxVdGlsLm9iamVjdElzU2V0dGFibGUodGhpcykgfHwgbXVsdGlGaWx0ZXJIZWxwZXIgPT0gbnVsbCl7DQorCQkJTXVsdGlGaWx0ZXJIZWxwZXIgb2xkTXVsdGlGaWx0ZXJIZWxwZXIgPSBtdWx0aUZpbHRlckhlbHBlcjsNCisJCQltdWx0aUZpbHRlckhlbHBlciA9IG5ld011bHRpRmlsdGVySGVscGVyOw0KKwkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fTVVMVElfRklMVEVSX0hFTFBFUiwgb2xkTXVsdGlGaWx0ZXJIZWxwZXIsIG11bHRpRmlsdGVySGVscGVyKSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7DQorCQlyZXR1cm4gdHlwZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGJhc2ljU2V0SW5wdXRQb3J0KG51bGwsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBiYXNpY1NldE91dHB1dFBvcnQobnVsbCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQ6DQorCQkJCXJldHVybiBnZXRJbnB1dFBvcnQoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fTVVMVElfRklMVEVSX0hFTFBFUjoNCisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRNdWx0aUZpbHRlckhlbHBlcigpOw0KKwkJCQlyZXR1cm4gYmFzaWNHZXRNdWx0aUZpbHRlckhlbHBlcigpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fVFlQRToNCisJCQkJcmV0dXJuIGdldFR5cGUoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJc2V0SW5wdXRQb3J0KChNdWx0aUlucHV0UG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlzZXRPdXRwdXRQb3J0KChNdWx0aU91dHB1dFBvcnQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19NVUxUSV9GSUxURVJfSEVMUEVSOg0KKwkJCQlzZXRNdWx0aUZpbHRlckhlbHBlcigoTXVsdGlGaWx0ZXJIZWxwZXIpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJc2V0SW5wdXRQb3J0KChNdWx0aUlucHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fT1VUUFVUX1BPUlQ6DQorCQkJCXNldE91dHB1dFBvcnQoKE11bHRpT3V0cHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fTVVMVElfRklMVEVSX0hFTFBFUjoNCisJCQkJc2V0TXVsdGlGaWx0ZXJIZWxwZXIoKE11bHRpRmlsdGVySGVscGVyKW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQ6DQorCQkJCXJldHVybiBpbnB1dFBvcnQgIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gb3V0cHV0UG9ydCAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GSUxURVJfVU5JVF9fTVVMVElfRklMVEVSX0hFTFBFUjoNCisJCQkJcmV0dXJuIG11bHRpRmlsdGVySGVscGVyICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKHR5cGUpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL011bHRpRmlsdGVyVW5pdEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aUlucHV0UG9ydEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpSW5wdXRQb3J0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmU3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aUlucHV0UG9ydEltcGwuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlBvcnRNYXBwaW5nOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpIElucHV0IFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlJbnB1dFBvcnRJbXBsIGV4dGVuZHMgTXVsdGlQb3J0SW1wbCBpbXBsZW1lbnRzIE11bHRpSW5wdXRQb3J0IHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlJbnB1dFBvcnRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX0lOUFVUX1BPUlQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQm9vbGVhbiBpc01hcHBpbmdUYXJnZXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9IHRoaXMuZUNvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSByZXR1cm4gdHJ1ZTsNCisJCXdoaWxlKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyByZWZTeXM7DQorCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCXJlZlN5cyA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb250YWluZXIgJ1JlZmFjdG9yaW5nU3lzdGVtJyBkb2Vzbid0IGV4aXN0cyIpOw0KKwkJfQ0KKwkJRUxpc3Q8UG9ydE1hcHBpbmc+IG1hcHBpbmdzID0gcmVmU3lzLmdldFBvcnRNYXBwaW5ncygpOw0KKwkJZm9yKFBvcnRNYXBwaW5nIG0gOiBtYXBwaW5ncykgew0KKwkJCWlmKG0uZ2V0VGFyZ2V0KCkgPT0gdGhpcykgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQm9vbGVhbiBpc1Jvb3RQb3J0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSB0aGlzLmVDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb250YWluZXIgZG9lc24ndCBleGlzdHMiKTsNCisJCWlmKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwl9DQorDQorfSAvL011bHRpSW5wdXRQb3J0SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpT3V0cHV0UG9ydEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpT3V0cHV0UG9ydEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDhlYzliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTXVsdGlPdXRwdXRQb3J0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5NdWx0aU91dHB1dFBvcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgT3V0cHV0IFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgTXVsdGlPdXRwdXRQb3J0SW1wbCBleHRlbmRzIE11bHRpUG9ydEltcGwgaW1wbGVtZW50cyBNdWx0aU91dHB1dFBvcnQgew0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aU91dHB1dFBvcnRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX09VVFBVVF9QT1JUOw0KKwl9DQorDQorfSAvL011bHRpT3V0cHV0UG9ydEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aVBvcnRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aVBvcnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxY2VhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpUG9ydEltcGwuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLk11bHRpUG9ydDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgUG9ydDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5NdWx0aVBvcnRJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpUG9ydEltcGwgZXh0ZW5kcyBQb3J0SW1wbCBpbXBsZW1lbnRzIE11bHRpUG9ydCB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFTGlzdDxPYmplY3Q+IHZhbHVlOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aVBvcnRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLk1VTFRJX1BPUlQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUxpc3Q8T2JqZWN0PiBnZXRWYWx1ZSgpIHsNCisJCWlmICh2YWx1ZSA9PSBudWxsKSB7DQorCQkJdmFsdWUgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3Q8T2JqZWN0PihPYmplY3QuY2xhc3MsIHRoaXMsIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVF9fVkFMVUUpOw0KKwkJfQ0KKwkJcmV0dXJuIHZhbHVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1BPUlRfX1ZBTFVFOg0KKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVF9fVkFMVUU6DQorCQkJCWdldFZhbHVlKCkuY2xlYXIoKTsNCisJCQkJZ2V0VmFsdWUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE9iamVjdD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX19WQUxVRToNCisJCQkJZ2V0VmFsdWUoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVF9fVkFMVUU6DQorCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5pc0VtcHR5KCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsNCisJCXJlc3VsdC5hcHBlbmQoJyknKTsNCisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCisJfQ0KKw0KK30gLy9NdWx0aVBvcnRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvTXVsdGlQb3J0TWFwcGluZ0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpUG9ydE1hcHBpbmdJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyYTg2OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpUG9ydE1hcHBpbmdJbXBsLmphdmEKQEAgLTAsMCArMSwyNDUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLk11bHRpUG9ydDsNCitpbXBvcnQgY29tcmVsLk11bHRpUG9ydE1hcHBpbmc7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgUG9ydCBNYXBwaW5nPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpUG9ydE1hcHBpbmdJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuTXVsdGlQb3J0TWFwcGluZ0ltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVBvcnRNYXBwaW5nSW1wbCBleHRlbmRzIFBvcnRNYXBwaW5nSW1wbCBpbXBsZW1lbnRzIE11bHRpUG9ydE1hcHBpbmcgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0U291cmNlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE11bHRpUG9ydCBzb3VyY2U7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXQoKSA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUYXJnZXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlJbnB1dFBvcnQgdGFyZ2V0Ow0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBNdWx0aVBvcnRNYXBwaW5nSW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5NVUxUSV9QT1JUX01BUFBJTkc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTXVsdGlQb3J0IGdldFNvdXJjZSgpIHsNCisJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuZUlzUHJveHkoKSkgew0KKwkJCUludGVybmFsRU9iamVjdCBvbGRTb3VyY2UgPSAoSW50ZXJuYWxFT2JqZWN0KXNvdXJjZTsNCisJCQlzb3VyY2UgPSAoTXVsdGlQb3J0KWVSZXNvbHZlUHJveHkob2xkU291cmNlKTsNCisJCQlpZiAoc291cmNlICE9IG9sZFNvdXJjZSkgew0KKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX01BUFBJTkdfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc291cmNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpUG9ydCBiYXNpY0dldFNvdXJjZSgpIHsNCisJCXJldHVybiBzb3VyY2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoTXVsdGlQb3J0IG5ld1NvdXJjZSkgew0KKwkJdGhpcy5yZXNldFZpc3VhbGl6YXRpb24oKTsNCisJCU11bHRpUG9ydCBvbGRTb3VyY2UgPSBzb3VyY2U7DQorCQlzb3VyY2UgPSBuZXdTb3VyY2U7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX01BUFBJTkdfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsNCisJCWlmKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsKXsNCisJCQlpZiAoc291cmNlLmdldFR5cGUoKSAhPSBudWxsKSB7DQorCQkJCXVwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzKHNvdXJjZS5nZXRUeXBlKCksc291cmNlLmdldFNpbmd1bGFyUG9ydE5hbWUoKSk7DQorCQkJfSBlbHNlIHsNCisJCQkJdXBkYXRlUG9ydFR5cGVzQW5kTmFtZXModGFyZ2V0LmdldFR5cGUoKSx0YXJnZXQuZ2V0U2luZ3VsYXJQb3J0TmFtZSgpKTsNCisJCQl9DQorCQkJdXBkYXRlTWFwcGluZ051bWJlcigpOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJdGhpcy51cGRhdGVDUlZpc3VhbGl6YXRpb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydCBnZXRUYXJnZXQoKSB7DQorCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmVJc1Byb3h5KCkpIHsNCisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkVGFyZ2V0ID0gKEludGVybmFsRU9iamVjdCl0YXJnZXQ7DQorCQkJdGFyZ2V0ID0gKE11bHRpSW5wdXRQb3J0KWVSZXNvbHZlUHJveHkob2xkVGFyZ2V0KTsNCisJCQlpZiAodGFyZ2V0ICE9IG9sZFRhcmdldCkgew0KKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX01BUFBJTkdfX1RBUkdFVCwgb2xkVGFyZ2V0LCB0YXJnZXQpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gdGFyZ2V0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0IGJhc2ljR2V0VGFyZ2V0KCkgew0KKwkJcmV0dXJuIHRhcmdldDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFRhcmdldChNdWx0aUlucHV0UG9ydCBuZXdUYXJnZXQpIHsNCisJCXRoaXMucmVzZXRWaXN1YWxpemF0aW9uKCk7DQorCQlNdWx0aUlucHV0UG9ydCBvbGRUYXJnZXQgPSB0YXJnZXQ7DQorCQl0YXJnZXQgPSBuZXdUYXJnZXQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX01BUFBJTkdfX1RBUkdFVCwgb2xkVGFyZ2V0LCB0YXJnZXQpKTsNCisJCWlmKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsKXsNCisJCQlpZiAodGFyZ2V0LmdldFR5cGUoKSAhPSBudWxsKSB7DQorCQkJCXVwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzKHRhcmdldC5nZXRUeXBlKCksdGFyZ2V0LmdldFNpbmd1bGFyUG9ydE5hbWUoKSk7DQorCQkJfSBlbHNlIHsNCisJCQkJdXBkYXRlUG9ydFR5cGVzQW5kTmFtZXMoc291cmNlLmdldFR5cGUoKSxzb3VyY2UuZ2V0U2luZ3VsYXJQb3J0TmFtZSgpKTsNCisJCQl9DQorCQkJdXBkYXRlTWFwcGluZ051bWJlcigpOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJdGhpcy51cGRhdGVDUlZpc3VhbGl6YXRpb24oKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX01BUFBJTkdfX1NPVVJDRToNCisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0U291cmNlKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1BPUlRfTUFQUElOR19fVEFSR0VUOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFRhcmdldCgpOw0KKwkJCQlyZXR1cm4gYmFzaWNHZXRUYXJnZXQoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9QT1JUX01BUFBJTkdfX1NPVVJDRToNCisJCQkJc2V0U291cmNlKChNdWx0aVBvcnQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1BPUlRfTUFQUElOR19fVEFSR0VUOg0KKwkJCQlzZXRUYXJnZXQoKE11bHRpSW5wdXRQb3J0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVF9NQVBQSU5HX19TT1VSQ0U6DQorCQkJCXNldFNvdXJjZSgoTXVsdGlQb3J0KW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1BPUlRfTUFQUElOR19fVEFSR0VUOg0KKwkJCQlzZXRUYXJnZXQoKE11bHRpSW5wdXRQb3J0KW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVF9NQVBQSU5HX19TT1VSQ0U6DQorCQkJCXJldHVybiBzb3VyY2UgIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVF9NQVBQSU5HX19UQVJHRVQ6DQorCQkJCXJldHVybiB0YXJnZXQgIT0gbnVsbDsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KK30gLy9NdWx0aVBvcnRNYXBwaW5nSW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL011bHRpU2luZ2xlUG9ydE1hcHBpbmdJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDRjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aSBTaW5nbGUgUG9ydCBNYXBwaW5nPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLk11bHRpU2luZ2xlUG9ydE1hcHBpbmdJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0ltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNdWx0aVNpbmdsZVBvcnRNYXBwaW5nSW1wbCBleHRlbmRzIFBvcnRNYXBwaW5nSW1wbCBpbXBsZW1lbnRzIE11bHRpU2luZ2xlUG9ydE1hcHBpbmcgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0U291cmNlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE11bHRpUG9ydCBzb3VyY2U7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXQoKSA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUYXJnZXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlSW5wdXRQb3J0IHRhcmdldDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0ltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuTVVMVElfU0lOR0xFX1BPUlRfTUFQUElORzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aVBvcnQgZ2V0U291cmNlKCkgew0KKwkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNvdXJjZSA9IChJbnRlcm5hbEVPYmplY3Qpc291cmNlOw0KKwkJCXNvdXJjZSA9IChNdWx0aVBvcnQpZVJlc29sdmVQcm94eShvbGRTb3VyY2UpOw0KKwkJCWlmIChzb3VyY2UgIT0gb2xkU291cmNlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21yZWxQYWNrYWdlLk1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkdfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc291cmNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpUG9ydCBiYXNpY0dldFNvdXJjZSgpIHsNCisJCXJldHVybiBzb3VyY2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoTXVsdGlQb3J0IG5ld1NvdXJjZSkgew0KKwkJdGhpcy5yZXNldFZpc3VhbGl6YXRpb24oKTsNCisJCU11bHRpUG9ydCBvbGRTb3VyY2UgPSBzb3VyY2U7DQorCQlzb3VyY2UgPSBuZXdTb3VyY2U7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5NVUxUSV9TSU5HTEVfUE9SVF9NQVBQSU5HX19TT1VSQ0UsIG9sZFNvdXJjZSwgc291cmNlKSk7DQorCQlpZihzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCl7DQorCQkJaWYgKHNvdXJjZS5nZXRUeXBlKCkgIT0gbnVsbCkgew0KKwkJCQl1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyhzb3VyY2UuZ2V0VHlwZSgpLHNvdXJjZS5nZXRTaW5ndWxhclBvcnROYW1lKCkpOw0KKwkJCX0gZWxzZSB7DQorCQkJCXVwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzKHRhcmdldC5nZXRUeXBlKCksdGFyZ2V0LmdldFNpbmd1bGFyUG9ydE5hbWUoKSk7DQorCQkJfQ0KKwkJCXVwZGF0ZU1hcHBpbmdOdW1iZXIoKTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXRoaXMudXBkYXRlQ1JWaXN1YWxpemF0aW9uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0IGdldFRhcmdldCgpIHsNCisJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZUlzUHJveHkoKSkgew0KKwkJCUludGVybmFsRU9iamVjdCBvbGRUYXJnZXQgPSAoSW50ZXJuYWxFT2JqZWN0KXRhcmdldDsNCisJCQl0YXJnZXQgPSAoU2luZ2xlSW5wdXRQb3J0KWVSZXNvbHZlUHJveHkob2xkVGFyZ2V0KTsNCisJCQlpZiAodGFyZ2V0ICE9IG9sZFRhcmdldCkgew0KKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcmVsUGFja2FnZS5NVUxUSV9TSU5HTEVfUE9SVF9NQVBQSU5HX19UQVJHRVQsIG9sZFRhcmdldCwgdGFyZ2V0KSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHRhcmdldDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQgYmFzaWNHZXRUYXJnZXQoKSB7DQorCQlyZXR1cm4gdGFyZ2V0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0KFNpbmdsZUlucHV0UG9ydCBuZXdUYXJnZXQpIHsNCisJCXRoaXMucmVzZXRWaXN1YWxpemF0aW9uKCk7DQorCQlTaW5nbGVJbnB1dFBvcnQgb2xkVGFyZ2V0ID0gdGFyZ2V0Ow0KKwkJdGFyZ2V0ID0gbmV3VGFyZ2V0Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VULCBvbGRUYXJnZXQsIHRhcmdldCkpOw0KKwkJaWYoc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpew0KKwkJCWlmICh0YXJnZXQuZ2V0VHlwZSgpICE9IG51bGwpIHsNCisJCQkJdXBkYXRlUG9ydFR5cGVzQW5kTmFtZXModGFyZ2V0LmdldFR5cGUoKSx0YXJnZXQuZ2V0U2luZ3VsYXJQb3J0TmFtZSgpKTsNCisJCQl9IGVsc2Ugew0KKwkJCQl1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyhzb3VyY2UuZ2V0VHlwZSgpLHNvdXJjZS5nZXRTaW5ndWxhclBvcnROYW1lKCkpOw0KKwkJCX0NCisJCQl1cGRhdGVNYXBwaW5nTnVtYmVyKCk7DQorCQl9DQorCQllbHNlIHsNCisJCQl0aGlzLnVwZGF0ZUNSVmlzdWFsaXphdGlvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkdfX1NPVVJDRToNCisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0U291cmNlKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkdfX1RBUkdFVDoNCisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUYXJnZXQoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0VGFyZ2V0KCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fU09VUkNFOg0KKwkJCQlzZXRTb3VyY2UoKE11bHRpUG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VUOg0KKwkJCQlzZXRUYXJnZXQoKFNpbmdsZUlucHV0UG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkdfX1NPVVJDRToNCisJCQkJc2V0U291cmNlKChNdWx0aVBvcnQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VUOg0KKwkJCQlzZXRUYXJnZXQoKFNpbmdsZUlucHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX1NJTkdMRV9QT1JUX01BUFBJTkdfX1NPVVJDRToNCisJCQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9TSU5HTEVfUE9SVF9NQVBQSU5HX19UQVJHRVQ6DQorCQkJCXJldHVybiB0YXJnZXQgIT0gbnVsbDsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KK30gLy9NdWx0aVNpbmdsZVBvcnRNYXBwaW5nSW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL091dHB1dFBvcnRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9PdXRwdXRQb3J0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDAzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9PdXRwdXRQb3J0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5PdXRwdXRQb3J0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dHB1dCBQb3J0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIE91dHB1dFBvcnRJbXBsIGV4dGVuZHMgUG9ydEltcGwgaW1wbGVtZW50cyBPdXRwdXRQb3J0IHsNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgT3V0cHV0UG9ydEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuT1VUUFVUX1BPUlQ7DQorCX0NCisNCit9IC8vT3V0cHV0UG9ydEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9QYXJhbGxlbFF1ZXVlZFVuaXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9QYXJhbGxlbFF1ZXVlZFVuaXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4MzE4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1BhcmFsbGVsUXVldWVkVW5pdEltcGwuamF2YQpAQCAtMCwwICsxLDQyNSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsRmFjdG9yeTsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5IZWxwZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQ7DQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYWxsZWwgUXVldWVkIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuUGFyYWxsZWxRdWV1ZWRVbml0SW1wbCNnZXRIZWxwZXJVbml0cyA8ZW0+SGVscGVyIFVuaXRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuUGFyYWxsZWxRdWV1ZWRVbml0SW1wbCNnZXRSZWZhY3RvcmluZ1VuaXRzIDxlbT5SZWZhY3RvcmluZyBVbml0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlBhcmFsbGVsUXVldWVkVW5pdEltcGwjZ2V0U2luZ2xlSW5wdXRQb3J0cyA8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuUGFyYWxsZWxRdWV1ZWRVbml0SW1wbCNnZXRNdWx0aUlucHV0UG9ydHMgPGVtPk11bHRpIElucHV0IFBvcnRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuUGFyYWxsZWxRdWV1ZWRVbml0SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuUGFyYWxsZWxRdWV1ZWRVbml0SW1wbCNnZXRMYmxTdHJpY3QgPGVtPkxibCBTdHJpY3Q8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBQYXJhbGxlbFF1ZXVlZFVuaXRJbXBsIGV4dGVuZHMgVHdpY2VkUXVldWVkVW5pdEltcGwgaW1wbGVtZW50cyBQYXJhbGxlbFF1ZXVlZFVuaXQgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVscGVyVW5pdHMoKSA8ZW0+SGVscGVyIFVuaXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldEhlbHBlclVuaXRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PEhlbHBlclVuaXQ+IGhlbHBlclVuaXRzOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmYWN0b3JpbmdVbml0cygpIDxlbT5SZWZhY3RvcmluZyBVbml0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0UmVmYWN0b3JpbmdVbml0cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBSZWZhY3RvcmluZ1VuaXQgcmVmYWN0b3JpbmdVbml0czsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpbmdsZUlucHV0UG9ydHMoKSA8ZW0+U2luZ2xlIElucHV0IFBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNpbmdsZUlucHV0UG9ydHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8U2luZ2xlSW5wdXRQb3J0PiBzaW5nbGVJbnB1dFBvcnRzOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXVsdGlJbnB1dFBvcnRzKCkgPGVtPk11bHRpIElucHV0IFBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE11bHRpSW5wdXRQb3J0cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFTGlzdDxNdWx0aUlucHV0UG9ydD4gbXVsdGlJbnB1dFBvcnRzOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSAiUGFyYWxsZWwgUXVldWVkIFVuaXQiOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUeXBlKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYmxTdHJpY3QoKSA8ZW0+TGJsIFN0cmljdDwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TGJsU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEJMX1NUUklDVF9FREVGQVVMVCA9ICJzdHJpY3QiOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGJsU3RyaWN0KCkgPGVtPkxibCBTdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldExibFN0cmljdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgbGJsU3RyaWN0ID0gTEJMX1NUUklDVF9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUGFyYWxsZWxRdWV1ZWRVbml0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QQVJBTExFTF9RVUVVRURfVU5JVDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxIZWxwZXJVbml0PiBnZXRIZWxwZXJVbml0cygpIHsNCisJCWlmIChoZWxwZXJVbml0cyA9PSBudWxsKSB7DQorCQkJaGVscGVyVW5pdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SGVscGVyVW5pdD4oSGVscGVyVW5pdC5jbGFzcywgdGhpcywgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTKTsNCisJCX0NCisJCXJldHVybiBoZWxwZXJVbml0czsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBSZWZhY3RvcmluZ1VuaXQgZ2V0UmVmYWN0b3JpbmdVbml0cygpIHsNCisJCXJldHVybiByZWZhY3RvcmluZ1VuaXRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmYWN0b3JpbmdVbml0cyhSZWZhY3RvcmluZ1VuaXQgbmV3UmVmYWN0b3JpbmdVbml0cywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJUmVmYWN0b3JpbmdVbml0IG9sZFJlZmFjdG9yaW5nVW5pdHMgPSByZWZhY3RvcmluZ1VuaXRzOw0KKwkJcmVmYWN0b3JpbmdVbml0cyA9IG5ld1JlZmFjdG9yaW5nVW5pdHM7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsIG9sZFJlZmFjdG9yaW5nVW5pdHMsIG5ld1JlZmFjdG9yaW5nVW5pdHMpOw0KKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJCXJldHVybiBtc2dzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0UmVmYWN0b3JpbmdVbml0cyhSZWZhY3RvcmluZ1VuaXQgbmV3UmVmYWN0b3JpbmdVbml0cykgew0KKwkJaWYgKG5ld1JlZmFjdG9yaW5nVW5pdHMgIT0gcmVmYWN0b3JpbmdVbml0cykgew0KKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOw0KKwkJCWlmIChyZWZhY3RvcmluZ1VuaXRzICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWZhY3RvcmluZ1VuaXRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdSZWZhY3RvcmluZ1VuaXRzICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZWZhY3RvcmluZ1VuaXRzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldFJlZmFjdG9yaW5nVW5pdHMobmV3UmVmYWN0b3JpbmdVbml0cywgbXNncyk7DQorCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOw0KKwkJfQ0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMsIG5ld1JlZmFjdG9yaW5nVW5pdHMsIG5ld1JlZmFjdG9yaW5nVW5pdHMpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxTaW5nbGVJbnB1dFBvcnQ+IGdldFNpbmdsZUlucHV0UG9ydHMoKSB7DQorCQlpZiAoc2luZ2xlSW5wdXRQb3J0cyA9PSBudWxsKSB7DQorCQkJc2luZ2xlSW5wdXRQb3J0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTaW5nbGVJbnB1dFBvcnQ+KFNpbmdsZUlucHV0UG9ydC5jbGFzcywgdGhpcywgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTKTsNCisJCX0NCisJCXJldHVybiBzaW5nbGVJbnB1dFBvcnRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PE11bHRpSW5wdXRQb3J0PiBnZXRNdWx0aUlucHV0UG9ydHMoKSB7DQorCQlpZiAobXVsdGlJbnB1dFBvcnRzID09IG51bGwpIHsNCisJCQltdWx0aUlucHV0UG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TXVsdGlJbnB1dFBvcnQ+KE11bHRpSW5wdXRQb3J0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUyk7DQorCQl9DQorCQlyZXR1cm4gbXVsdGlJbnB1dFBvcnRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KKwkJcmV0dXJuIHR5cGU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU3RyaW5nIGdldExibFN0cmljdCgpIHsNCisJCXJldHVybiBsYmxTdHJpY3Q7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRMYmxTdHJpY3QoU3RyaW5nIG5ld0xibFN0cmljdCkgew0KKwkJU3RyaW5nIG9sZExibFN0cmljdCA9IGxibFN0cmljdDsNCisJCWxibFN0cmljdCA9IG5ld0xibFN0cmljdDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19MQkxfU1RSSUNULCBvbGRMYmxTdHJpY3QsIGxibFN0cmljdCkpOw0KKwl9DQorCQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgc2V0U3RyaWN0KGJvb2xlYW4gbmV3U3RyaWN0KSB7DQorCQlzdXBlci5zZXRTdHJpY3QobmV3U3RyaWN0KTsNCisJCWlmIChuZXdTdHJpY3QpIHNldExibFN0cmljdCgic3RyaWN0Iik7DQorCQllbHNlIHNldExibFN0cmljdCgibm9uIHN0cmljdCIpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGVscGVyVW5pdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFM6DQorCQkJCXJldHVybiBiYXNpY1NldFJlZmFjdG9yaW5nVW5pdHMobnVsbCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2luZ2xlSW5wdXRQb3J0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNdWx0aUlucHV0UG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJCXJldHVybiBnZXRIZWxwZXJVbml0cygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFM6DQorCQkJCXJldHVybiBnZXRSZWZhY3RvcmluZ1VuaXRzKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRzKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0cygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fVFlQRToNCisJCQkJcmV0dXJuIGdldFR5cGUoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1Q6DQorCQkJCXJldHVybiBnZXRMYmxTdHJpY3QoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJZ2V0SGVscGVyVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlnZXRIZWxwZXJVbml0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSGVscGVyVW5pdD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUUzoNCisJCQkJc2V0UmVmYWN0b3JpbmdVbml0cygoUmVmYWN0b3JpbmdVbml0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTOg0KKwkJCQlnZXRTaW5nbGVJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJZ2V0U2luZ2xlSW5wdXRQb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2luZ2xlSW5wdXRQb3J0PiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlRTOg0KKwkJCQlnZXRNdWx0aUlucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlnZXRNdWx0aUlucHV0UG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE11bHRpSW5wdXRQb3J0PiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1Q6DQorCQkJCXNldExibFN0cmljdCgoU3RyaW5nKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJZ2V0SGVscGVyVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUUzoNCisJCQkJc2V0UmVmYWN0b3JpbmdVbml0cygoUmVmYWN0b3JpbmdVbml0KW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCWdldFNpbmdsZUlucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUUzoNCisJCQkJZ2V0TXVsdGlJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJc2V0TGJsU3RyaWN0KExCTF9TVFJJQ1RfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJcmV0dXJuIGhlbHBlclVuaXRzICE9IG51bGwgJiYgIWhlbHBlclVuaXRzLmlzRW1wdHkoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVRTOg0KKwkJCQlyZXR1cm4gcmVmYWN0b3JpbmdVbml0cyAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0cyAhPSBudWxsICYmICFzaW5nbGVJbnB1dFBvcnRzLmlzRW1wdHkoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUEFSQUxMRUxfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gbXVsdGlJbnB1dFBvcnRzICE9IG51bGwgJiYgIW11bHRpSW5wdXRQb3J0cy5pc0VtcHR5KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBBUkFMTEVMX1FVRVVFRF9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJcmV0dXJuIExCTF9TVFJJQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGxibFN0cmljdCAhPSBudWxsIDogIUxCTF9TVFJJQ1RfRURFRkFVTFQuZXF1YWxzKGxibFN0cmljdCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodHlwZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGxibFN0cmljdDogIik7DQorCQlyZXN1bHQuYXBwZW5kKGxibFN0cmljdCk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIGluaXQoKXsNCisJCUNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwkJTXVsdGlJbnB1dFBvcnQgb25lID0gZmFjdG9yeS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKwkJTXVsdGlJbnB1dFBvcnQgdHdvID0gZmFjdG9yeS5jcmVhdGVNdWx0aUlucHV0UG9ydCgpOw0KKwkJdGhpcy5nZXRNdWx0aUlucHV0UG9ydHMoKS5hZGQob25lKTsNCisJCXRoaXMuZ2V0TXVsdGlJbnB1dFBvcnRzKCkuYWRkKHR3byk7DQorCX0NCisJDQorCXB1YmxpYyBFTGlzdDxJbnB1dFBvcnQ+IGdldEFsbElucHV0UG9ydHMoKSB7DQorCQlFTGlzdDxJbnB1dFBvcnQ+IGlucHV0UG9ydHMgPSBuZXcgQmFzaWNFTGlzdDxJbnB1dFBvcnQ+KCk7DQorCQlpbnB1dFBvcnRzLmFkZEFsbCh0aGlzLmdldFNpbmdsZUlucHV0UG9ydHMoKSk7DQorCQlpbnB1dFBvcnRzLmFkZEFsbCh0aGlzLmdldE11bHRpSW5wdXRQb3J0cygpKTsNCisJCXJldHVybiBpbnB1dFBvcnRzOw0KKwl9DQorCQ0KKwkNCisNCit9IC8vUGFyYWxsZWxRdWV1ZWRVbml0SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1BvcnRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Qb3J0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjAwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Qb3J0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzg5IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5EZXNjcmliZWRFbGVtZW50Ow0KK2ltcG9ydCBjb21yZWwuSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuT3V0cHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlBvcnQ7DQoraW1wb3J0IGNvbXJlbC5Qb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVBvcnQ7DQoraW1wb3J0IGNvbXJlbC5maWd1cmVzLklucHV0UG9ydEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLmZpZ3VyZXMuT3V0cHV0UG9ydEZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLnV0aWwuQ29tcmVsVXRpbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlBvcnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Qb3J0SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5Qb3J0SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUG9ydEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBvcnQgew0KKwkNCisJcHVibGljIFNoYXBlIGZpZ3VyZTsNCisNCisJcHVibGljIFNoYXBlIGdldEZpZ3VyZSgpIHsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisNCisJcHVibGljIHZvaWQgc2V0RmlndXJlKFNoYXBlIGZpZ3VyZSkgew0KKwkJdGhpcy5maWd1cmUgPSBmaWd1cmU7DQorCX0NCisJDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXROYW1lKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBDbGFzcyB0eXBlOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBQb3J0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5QT1JUOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKwkJcmV0dXJuIG5hbWU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQorCQlpZiAoQ29tcmVsVXRpbC5wb3J0SXNTZXR0YWJsZSh0aGlzKSkgew0KKwkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsNCisJCQluYW1lID0gbmV3TmFtZTsNCisJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuUE9SVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCisJCXJldHVybiBkZXNjcmlwdGlvbjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgew0KKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQorCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOw0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuUE9SVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENsYXNzIGdldFR5cGUoKSB7DQorCQlyZXR1cm4gdHlwZTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3MgbmV3VHlwZSkgew0KKwkJdGhpcy5zZXRUeXBlKG5ld1R5cGUsIHRydWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0VHlwZShDbGFzcyBuZXdUeXBlLCBib29sZWFuIGluaXRpYXRvcikgew0KKwkJaWYgKENvbXJlbFV0aWwucG9ydElzU2V0dGFibGUodGhpcykpIHsNCisJCQlDbGFzcyBvbGRUeXBlID0gdHlwZTsNCisJCQl0eXBlID0gbmV3VHlwZTsNCisJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsDQorCQkJCQkJQ29tcmVsUGFja2FnZS5QT1JUX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7DQorCQkJaWYgKGluaXRpYXRvciAmJiB0aGlzLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gQ29tcmVsVXRpbC5nZXRDb250YWluZWRDb21wb3NpdGVSZWZhY3RvcmluZyh0aGlzKTsNCisJCQkJZm9yIChQb3J0TWFwcGluZyBwbSA6IGNyLmdldFBvcnRNYXBwaW5ncygpKSB7DQorCQkJCQlpZiAocG0uZ2V0U291cmNlKCkgPT0gdGhpcyB8fCBwbS5nZXRUYXJnZXQoKSA9PSB0aGlzKSB7DQorCQkJCQkJcG0udXBkYXRlUG9ydFR5cGVzQW5kTmFtZXMobmV3VHlwZSwgdGhpcw0KKwkJCQkJCQkJLmdldFNpbmd1bGFyUG9ydE5hbWUoKSk7DQorCQkJCQkJcmV0dXJuOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKy8vCQl1cGRhdGVGaWd1cmUoKTsNCisJfQ0KKw0KKwlwcml2YXRlIHZvaWQgdXBkYXRlRmlndXJlKCkgew0KKwkJaWYgKHRoaXMuZ2V0RmlndXJlKCkgIT0gbnVsbCkgew0KKwkJCWlmICh0aGlzIGluc3RhbmNlb2YgSW5wdXRQb3J0KSB7DQorCQkJCUlucHV0UG9ydEZpZ3VyZSBmID0gKElucHV0UG9ydEZpZ3VyZSkgdGhpcy5nZXRGaWd1cmUoKTsNCisJCQkJZi51cGRhdGVGaWd1cmUoKTsNCisJCQl9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBPdXRwdXRQb3J0KSB7DQorCQkJCU91dHB1dFBvcnRGaWd1cmUgZiA9IChPdXRwdXRQb3J0RmlndXJlKSB0aGlzLmdldEZpZ3VyZSgpOw0KKwkJCQlmLnVwZGF0ZUZpZ3VyZSgpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHVwZGF0ZVBvcnROYW1lKFN0cmluZyBzaW5ndWxhclBvcnROYW1lKSB7DQorCQkvLyBuZXcNCisJCWlmICh0aGlzLm5hbWUgIT0gbnVsbCAmJiAhIHRoaXMubmFtZS5pc0VtcHR5KCkpIHJldHVybjsNCisJCS8vIGVuZCBuZXcNCisJCWlmICh0aGlzIGluc3RhbmNlb2YgU2luZ2xlUG9ydCkgew0KKwkJCXRoaXMuc2V0TmFtZShzaW5ndWxhclBvcnROYW1lKTsNCisJCX0gZWxzZSB7DQorCQkJU3RyaW5nIHBsdXJhbFBvcnROYW1lID0gQ29tcmVsVXRpbA0KKwkJCQkJLmNvbnZlcnRTaW5ndWxhclRvUGx1cmFsUG9ydE5hbWUoc2luZ3VsYXJQb3J0TmFtZSk7DQorCQkJdGhpcy5zZXROYW1lKHBsdXJhbFBvcnROYW1lKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0U2luZ3VsYXJQb3J0TmFtZSgpIHsNCisJCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgew0KKwkJCXJldHVybiAiIjsNCisJCX0NCisJCWlmICh0aGlzIGluc3RhbmNlb2YgU2luZ2xlUG9ydCkgew0KKwkJCXJldHVybiB0aGlzLmdldE5hbWUoKTsNCisJCX0gZWxzZSB7DQorCQkJU3RyaW5nIHNpbmd1bGFyUG9ydE5hbWUgPSBDb21yZWxVdGlsLmNvbnZlcnRQbHVyYWxUb1Npbmd1bGFyUG9ydE5hbWUodGhpcw0KKwkJCQkJLmdldE5hbWUoKSk7DQorCQkJcmV0dXJuIHNpbmd1bGFyUG9ydE5hbWU7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fTkFNRToNCisJCQkJcmV0dXJuIGdldE5hbWUoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fREVTQ1JJUFRJT046DQorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QT1JUX19UWVBFOg0KKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBPUlRfX05BTUU6DQorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fREVTQ1JJUFRJT046DQorCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBPUlRfX1RZUEU6DQorCQkJCXNldFR5cGUoKENsYXNzKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fTkFNRToNCisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QT1JUX19ERVNDUklQVElPTjoNCisJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBPUlRfX1RZUEU6DQorCQkJCXNldFR5cGUoKENsYXNzKW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fTkFNRToNCisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fREVTQ1JJUFRJT046DQorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QT1JUX19UWVBFOg0KKwkJCQlyZXR1cm4gdHlwZSAhPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsNCisJCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpYmVkRWxlbWVudC5jbGFzcykgew0KKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgew0KKwkJCQljYXNlIENvbXJlbFBhY2thZ2UuUE9SVF9fREVTQ1JJUFRJT046IHJldHVybiBDb21yZWxQYWNrYWdlLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTjsNCisJCQkJZGVmYXVsdDogcmV0dXJuIC0xOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7DQorCQlpZiAoYmFzZUNsYXNzID09IERlc2NyaWJlZEVsZW1lbnQuY2xhc3MpIHsNCisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsNCisJCQkJY2FzZSBDb21yZWxQYWNrYWdlLkRFU0NSSUJFRF9FTEVNRU5UX19ERVNDUklQVElPTjogcmV0dXJuIENvbXJlbFBhY2thZ2UuUE9SVF9fREVTQ1JJUFRJT047DQorCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQobmFtZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodHlwZSk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCit9IC8vUG9ydEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Qb3J0TWFwcGluZ0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1BvcnRNYXBwaW5nSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjI5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Qb3J0TWFwcGluZ0ltcGwuamF2YQpAQCAtMCwwICsxLDMzMyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NYXBwaW5nVmlzdWFsaXphdGlvbjsNCitpbXBvcnQgY29tcmVsLlBvcnQ7DQoraW1wb3J0IGNvbXJlbC5Qb3J0TWFwcGluZzsNCitpbXBvcnQgY29tcmVsLmZpZ3VyZXMuSW5wdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5PdXRwdXRQb3J0RmlndXJlOw0KK2ltcG9ydCBjb21yZWwuZmlndXJlcy5Qb3J0TWFwcGluZ0ZpZ3VyZTsNCitpbXBvcnQgY29tcmVsLnV0aWwuQ29tcmVsVXRpbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IE1hcHBpbmc8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUG9ydE1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQb3J0TWFwcGluZyB7DQorCQ0KKwlwdWJsaWMgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsNCisNCisJcHVibGljIFBvcnRNYXBwaW5nRmlndXJlIGZpZ3VyZTsNCisNCisJcHVibGljIGludCBtYXBwaW5nTnVtYmVyID0gSW50ZWdlci5NQVhfVkFMVUU7DQorCQ0KKwkNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgUG9ydE1hcHBpbmdJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlBPUlRfTUFQUElORzsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBQb3J0IGdldFNvdXJjZSgpIHsNCisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZA0KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIElucHV0UG9ydCBnZXRUYXJnZXQoKSB7DQorCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QNCisJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UDQorCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHVwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzKENsYXNzIHR5cGUsIFN0cmluZyBzaW5ndWxhclBvcnROYW1lKSB7DQorCQlpZiAodHlwZSAhPSBudWxsKSB7DQorCQkJaWYgKGdldFNvdXJjZSgpICE9IG51bGwgJiYgZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgew0KKwkJCQlnZXRTb3VyY2UoKS51cGRhdGVQb3J0TmFtZShzaW5ndWxhclBvcnROYW1lKTsNCisJCQkJZ2V0VGFyZ2V0KCkudXBkYXRlUG9ydE5hbWUoc2luZ3VsYXJQb3J0TmFtZSk7DQorCQkJCWlmIChnZXRTb3VyY2UoKS5nZXRUeXBlKCkgPT0gbnVsbA0KKwkJCQkJCSYmIGdldFRhcmdldCgpLmdldFR5cGUoKSA9PSBudWxsKSB7DQorCQkJCQlyZXR1cm47DQorCQkJCX0NCisJCQkJYm9vbGVhbiBmbGFnID0gZmFsc2U7DQorCQkJCWlmICghQ29tcmVsVXRpbC5wb3J0SXNTZXR0YWJsZShnZXRTb3VyY2UoKSkpIHsNCisJCQkJCWlmIChnZXRTb3VyY2UoKS5nZXRUeXBlKCkgPT0gbnVsbA0KKwkJCQkJCQl8fCAhZ2V0U291cmNlKCkuZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgew0KKwkJCQkJCXVwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzKGdldFNvdXJjZSgpLmdldFR5cGUoKSwNCisJCQkJCQkJCWdldFNvdXJjZSgpLmdldFNpbmd1bGFyUG9ydE5hbWUoKSk7DQorCQkJCQkJcmV0dXJuOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWlmICghQ29tcmVsVXRpbC5wb3J0SXNTZXR0YWJsZShnZXRUYXJnZXQoKSkpIHsNCisJCQkJCWlmIChnZXRUYXJnZXQoKS5nZXRUeXBlKCkgPT0gbnVsbA0KKwkJCQkJCQl8fCAhZ2V0VGFyZ2V0KCkuZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgew0KKwkJCQkJCXVwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzKGdldFRhcmdldCgpLmdldFR5cGUoKSwNCisJCQkJCQkJCWdldFRhcmdldCgpLmdldFNpbmd1bGFyUG9ydE5hbWUoKSk7DQorCQkJCQkJcmV0dXJuOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWdldFNvdXJjZSgpLnVwZGF0ZVBvcnROYW1lKHNpbmd1bGFyUG9ydE5hbWUpOw0KKwkJCQlnZXRUYXJnZXQoKS51cGRhdGVQb3J0TmFtZShzaW5ndWxhclBvcnROYW1lKTsNCisJCQkJaWYgKGdldFNvdXJjZSgpLmdldFR5cGUoKSA9PSBudWxsDQorCQkJCQkJfHwgIWdldFNvdXJjZSgpLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsNCisJCQkJCWdldFNvdXJjZSgpLnNldFR5cGUodHlwZSwgZmFsc2UpOw0KKwkJCQkJZmxhZyA9IHRydWU7DQorCQkJCX0NCisJCQkJaWYgKGdldFRhcmdldCgpLmdldFR5cGUoKSA9PSBudWxsDQorCQkJCQkJfHwgIWdldFRhcmdldCgpLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsNCisJCQkJCWdldFRhcmdldCgpLnNldFR5cGUodHlwZSwgZmFsc2UpOw0KKwkJCQkJZmxhZyA9IHRydWU7DQorCQkJCX0NCisJCQkJaWYgKGZsYWcpIHsNCisJCQkJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIHJlZlN5cyA9IENvbXJlbFV0aWwNCisJCQkJCQkJLmdldENvbnRhaW5lZENvbXBvc2l0ZVJlZmFjdG9yaW5nKGdldFNvdXJjZSgpKTsNCisNCisJCQkJCWJvb2xlYW4gY29uOw0KKwkJCQkJZm9yIChQb3J0TWFwcGluZyBtYXAgOiByZWZTeXMuZ2V0UG9ydE1hcHBpbmdzKCkpIHsNCisJCQkJCQlpZiAobWFwICE9IHRoaXMpIHsNCisJCQkJCQkJY29uID0gbWFwLmdldFNvdXJjZSgpID09IHRoaXMuZ2V0U291cmNlKCk7DQorCQkJCQkJCWNvbiB8PSBtYXAuZ2V0U291cmNlKCkgPT0gdGhpcy5nZXRUYXJnZXQoKTsNCisJCQkJCQkJY29uIHw9IG1hcC5nZXRUYXJnZXQoKSA9PSB0aGlzLmdldFNvdXJjZSgpOw0KKwkJCQkJCQljb24gfD0gbWFwLmdldFRhcmdldCgpID09IHRoaXMuZ2V0VGFyZ2V0KCk7DQorCQkJCQkJCWlmIChjb24pIHsNCisJCQkJCQkJCW1hcC51cGRhdGVQb3J0VHlwZXNBbmROYW1lcyh0eXBlLA0KKwkJCQkJCQkJCQlzaW5ndWxhclBvcnROYW1lKTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHVwZGF0ZU1hcHBpbmdOdW1iZXIoKSB7DQorCQlpbnQgbU51bWJlciA9IEludGVnZXIuTUFYX1ZBTFVFOw0KKw0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgY3IgPSB0aGlzLmdldENvbXBvc2l0ZVJlZmFjdG9yaW5nKCk7DQorCQlpZiAoY3IgPT0gbnVsbCkgew0KKwkJCXRoaXMuc2V0TWFwcGluZ051bWJlcihJbnRlZ2VyLk1BWF9WQUxVRSk7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJYm9vbGVhbiBjb247DQorCQlBcnJheUxpc3Q8UG9ydE1hcHBpbmc+IHRNYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Q8UG9ydE1hcHBpbmc+KCk7DQorCQlpZiAoY3IuZ2V0UG9ydE1hcHBpbmdzKCkgIT0gbnVsbCkgew0KKw0KKwkJCWZvciAoUG9ydE1hcHBpbmcgbWFwIDogY3IuZ2V0UG9ydE1hcHBpbmdzKCkpIHsNCisJCQkJaWYgKG1hcCAhPSB0aGlzKSB7DQorCQkJCQljb24gPSBtYXAuZ2V0U291cmNlKCkgPT0gdGhpcy5nZXRTb3VyY2UoKTsNCisJCQkJCWNvbiB8PSBtYXAuZ2V0U291cmNlKCkgPT0gdGhpcy5nZXRUYXJnZXQoKTsNCisJCQkJCWNvbiB8PSBtYXAuZ2V0VGFyZ2V0KCkgPT0gdGhpcy5nZXRTb3VyY2UoKTsNCisJCQkJCWNvbiB8PSBtYXAuZ2V0VGFyZ2V0KCkgPT0gdGhpcy5nZXRUYXJnZXQoKTsNCisJCQkJCWlmIChjb24pIHsNCisJCQkJCQltTnVtYmVyID0gTWF0aC5taW4obU51bWJlciwgbWFwLmdldE1hcHBpbmdOdW1iZXIoKSk7DQorCQkJCQkJdE1hcHBpbmdzLmFkZChtYXApOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKG1OdW1iZXIgPT0gSW50ZWdlci5NQVhfVkFMVUUpIHsNCisJCQltTnVtYmVyID0gMTsNCisNCisJCQl3aGlsZSAoY3IuZ2V0TWFwcGluZ051bWJlcnMoKS5jb250YWlucyhtTnVtYmVyKSkgew0KKwkJCQltTnVtYmVyKys7DQorCQkJfQ0KKwkJfQ0KKwkJY3IuZ2V0TWFwcGluZ051bWJlcnMoKS5hZGQobU51bWJlcik7DQorCQl0aGlzLnNldE1hcHBpbmdOdW1iZXIobU51bWJlcik7DQorDQorCQlmb3IgKFBvcnRNYXBwaW5nIG0gOiB0TWFwcGluZ3MpIHsNCisJCQlpZiAobS5nZXRNYXBwaW5nTnVtYmVyKCkgIT0gbU51bWJlcikgew0KKwkJCQltLnVwZGF0ZU1hcHBpbmdOdW1iZXIoKTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB1cGRhdGVWaXN1YWxpemF0aW9uKCkgew0KKwkJaWYgKG1hcHBpbmdOdW1iZXIgPT0gSW50ZWdlci5NQVhfVkFMVUUpDQorCQkJdXBkYXRlTWFwcGluZ051bWJlcigpOw0KKwkJaWYgKGZpZ3VyZSA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJQ29tcG9zaXRlUmVmYWN0b3JpbmcgcmVmU3lzID0gdGhpcy5nZXRDb21wb3NpdGVSZWZhY3RvcmluZygpOw0KKwkJaWYgKHJlZlN5cyA9PSBudWxsKSB7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJdGhpcy5yZXNldFZpc3VhbGl6YXRpb24oKTsNCisJCU1hcHBpbmdWaXN1YWxpemF0aW9uIHZpc3VhbGl6YXRpb24gPSByZWZTeXMuZ2V0TWFwcGluZ1Zpc3VhbGl6YXRpb24oKTsNCisJCUNvbG9yIGJnOw0KKwkJc3dpdGNoICh2aXN1YWxpemF0aW9uLmdldFZhbHVlKCkpIHsNCisJCWNhc2UgTWFwcGluZ1Zpc3VhbGl6YXRpb24uQVJST1dTX1ZBTFVFOg0KKwkJCXRoaXMuZmlndXJlLnNldFZpc2libGUodHJ1ZSk7DQorCQkJdGhpcy5zZXRWaXNpYmxlKGZhbHNlKTsNCisJCQlicmVhazsNCisJCWNhc2UgTWFwcGluZ1Zpc3VhbGl6YXRpb24uQ09MT1JFRF9QT1JUU19WQUxVRToNCisJCQliZyA9IENvbXJlbFV0aWwuZ2V0Q29sb3IodGhpcy5nZXRNYXBwaW5nTnVtYmVyKCkpOw0KKwkJCXRoaXMuZmlndXJlLnNldFZpc2libGUoZmFsc2UpOw0KKwkJCXRoaXMuc2V0Q29sb3JlZFBvcnRzKGJnKTsNCisJCQlicmVhazsNCisJCWNhc2UgTWFwcGluZ1Zpc3VhbGl6YXRpb24uSU5ESUNFU19WQUxVRToNCisJCQl0aGlzLmZpZ3VyZS5zZXRWaXNpYmxlKGZhbHNlKTsNCisJCQl0aGlzLnNldFBvcnRJbmRleFZpc3VhbGl6YXRpb24odHJ1ZSk7DQorCQkJYnJlYWs7DQorCQljYXNlIE1hcHBpbmdWaXN1YWxpemF0aW9uLkFSUk9XU19BTkRfQ09MT1JFRF9QT1JUU19WQUxVRToNCisJCQliZyA9IENvbXJlbFV0aWwuZ2V0Q29sb3IodGhpcy5nZXRNYXBwaW5nTnVtYmVyKCkpOw0KKwkJCXRoaXMuZmlndXJlLnNldFZpc2libGUodHJ1ZSk7DQorCQkJdGhpcy5zZXRDb2xvcmVkUG9ydHMoYmcpOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBNYXBwaW5nVmlzdWFsaXphdGlvbi5BUlJPV1NfQU5EX0lORElDRVNfVkFMVUU6DQorCQkJdGhpcy5maWd1cmUuc2V0VmlzaWJsZSh0cnVlKTsNCisJCQl0aGlzLnNldFBvcnRJbmRleFZpc3VhbGl6YXRpb24odHJ1ZSk7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisJDQorCXByaXZhdGUgQ29tcG9zaXRlUmVmYWN0b3JpbmcgZ2V0Q29tcG9zaXRlUmVmYWN0b3JpbmcoKSB7DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjciA9IENvbXJlbFV0aWwuZ2V0Q29udGFpbmVkQ29tcG9zaXRlUmVmYWN0b3JpbmcodGhpcyk7DQorCQlyZXR1cm4gY3I7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdOdW1iZXIoaW50IG1hcHBpbmdOdW1iZXIpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gdGhpcy5nZXRDb21wb3NpdGVSZWZhY3RvcmluZygpOw0KKwkJdGhpcy5tYXBwaW5nTnVtYmVyID0gbWFwcGluZ051bWJlcjsNCisJCWlmIChjciAhPSBudWxsKSB7DQorCQkJY3IuZ2V0TWFwcGluZ051bWJlcnMoKS5hZGQobWFwcGluZ051bWJlcik7DQorCQl9DQorCX0NCisNCisJcHVibGljIGludCBnZXRNYXBwaW5nTnVtYmVyKCkgew0KKwkJcmV0dXJuIG1hcHBpbmdOdW1iZXI7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHNldEZpZ3VyZShQb3J0TWFwcGluZ0ZpZ3VyZSBmaWd1cmUpIHsNCisJCXRoaXMuZmlndXJlID0gZmlndXJlOw0KKwkJdGhpcy51cGRhdGVWaXN1YWxpemF0aW9uKCk7DQorCX0NCisNCisJcHVibGljIFBvcnRNYXBwaW5nRmlndXJlIGdldEZpZ3VyZSgpIHsNCisJCXJldHVybiBmaWd1cmU7DQorCX0NCisJDQorCXByaXZhdGUgdm9pZCBzZXRDb2xvcmVkUG9ydHMoQ29sb3IgYmcpIHsNCisJCWlmICh0aGlzLmdldFNvdXJjZSgpICE9IG51bGwpIHsNCisJCQlpZiAodGhpcy5nZXRTb3VyY2UoKS5nZXRGaWd1cmUoKSAhPSBudWxsKSB7DQorCQkJCXRoaXMuZ2V0U291cmNlKCkuZ2V0RmlndXJlKCkuc2V0QmFja2dyb3VuZENvbG9yKGJnKTsNCisJCQl9DQorCQl9DQorCQlpZiAodGhpcy5nZXRUYXJnZXQoKSAhPSBudWxsKSB7DQorCQkJaWYgKHRoaXMuZ2V0VGFyZ2V0KCkuZ2V0RmlndXJlKCkgIT0gbnVsbCkgew0KKwkJCQl0aGlzLmdldFRhcmdldCgpLmdldEZpZ3VyZSgpLnNldEJhY2tncm91bmRDb2xvcihiZyk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXByb3RlY3RlZCB2b2lkIHJlc2V0VmlzdWFsaXphdGlvbigpIHsNCisJCWlmICh0aGlzLmZpZ3VyZSAhPSBudWxsKSB7DQorCQkJdGhpcy5maWd1cmUuc2V0VmlzaWJsZSh0cnVlKTsNCisJCQl0aGlzLnNldFZpc2libGUodHJ1ZSk7DQorCQl9DQorCQlDb2xvciBiZyA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsNCisJCXRoaXMuc2V0Q29sb3JlZFBvcnRzKGJnKTsNCisJCXNldFBvcnRJbmRleFZpc3VhbGl6YXRpb24oZmFsc2UpOw0KKwl9DQorDQorCXByaXZhdGUgdm9pZCBzZXRQb3J0SW5kZXhWaXN1YWxpemF0aW9uKGJvb2xlYW4gdmlzdWFsaXphdGlvbikgew0KKwkJaWYgKHRoaXMuZ2V0U291cmNlKCkgIT0gbnVsbCkgew0KKwkJCXNldFBvcnRJbmRleFZpc3VhbGl6YXRpb24odGhpcy5nZXRTb3VyY2UoKSwgdmlzdWFsaXphdGlvbik7DQorCQl9DQorCQlpZiAodGhpcy5nZXRUYXJnZXQoKSAhPSBudWxsKSB7DQorCQkJc2V0UG9ydEluZGV4VmlzdWFsaXphdGlvbih0aGlzLmdldFRhcmdldCgpLCB2aXN1YWxpemF0aW9uKTsNCisJCX0NCisJfQ0KKw0KKwlwcml2YXRlIHZvaWQgc2V0UG9ydEluZGV4VmlzdWFsaXphdGlvbihQb3J0IHAsIGJvb2xlYW4gdmlzaWJsZSkgew0KKwkJU2hhcGUgZiA9IG51bGw7DQorCQlpZiAocC5nZXRGaWd1cmUoKSAhPSBudWxsKSB7DQorCQkJZiA9IHAuZ2V0RmlndXJlKCk7DQorCQkJaWYgKGYgaW5zdGFuY2VvZiBJbnB1dFBvcnRGaWd1cmUpIHsNCisJCQkJSW5wdXRQb3J0RmlndXJlIGkgPSAoKElucHV0UG9ydEZpZ3VyZSkgZik7DQorCQkJCWkuc2V0TGFiZWwoIiIgKyB0aGlzLmdldE1hcHBpbmdOdW1iZXIoKSk7DQorCQkJCWkuZ2V0TGFiZWwoKS5zZXRWaXNpYmxlKHZpc2libGUpOw0KKwkJCX0NCisJCQlpZiAoZiBpbnN0YW5jZW9mIE91dHB1dFBvcnRGaWd1cmUpIHsNCisJCQkJT3V0cHV0UG9ydEZpZ3VyZSBvID0gKChPdXRwdXRQb3J0RmlndXJlKSBmKTsNCisJCQkJby5zZXRMYWJlbCgiIiArIHRoaXMuZ2V0TWFwcGluZ051bWJlcigpKTsNCisJCQkJby5nZXRMYWJlbCgpLnNldFZpc2libGUodmlzaWJsZSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsNCisJCXJldHVybiB2aXNpYmxlOw0KKwl9DQorDQorCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQorCQl0aGlzLnZpc2libGUgPSB2aXNpYmxlOw0KKw0KKwl9DQorDQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNSVmlzdWFsaXphdGlvbigpIHsNCisJCUNvbXBvc2l0ZVJlZmFjdG9yaW5nIGNyID0gQ29tcmVsVXRpbC5nZXRDb250YWluZWRDb21wb3NpdGVSZWZhY3RvcmluZyh0aGlzKTsNCisJCWlmIChjciAhPSBudWxsKSB7DQorCQkJY3IudXBkYXRlVmlzdWFsaXphdGlvbigpOw0KKwkJfQ0KKwl9CQ0KKw0KK30gLy9Qb3J0TWFwcGluZ0ltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9RdWV1ZWRVbml0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvUXVldWVkVW5pdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFiNjNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvUXVldWVkVW5pdEltcGwuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLlF1ZXVlZFVuaXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UXVldWVkIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuUXVldWVkVW5pdEltcGwjaXNTdHJpY3QgPGVtPlN0cmljdDwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIFF1ZXVlZFVuaXRJbXBsIGV4dGVuZHMgQ29tcG9zaXRlVW5pdEltcGwgaW1wbGVtZW50cyBRdWV1ZWRVbml0IHsNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0cmljdCgpIDxlbT5TdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2lzU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUUklDVF9FREVGQVVMVCA9IHRydWU7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0cmljdCgpIDxlbT5TdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2lzU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0ID0gU1RSSUNUX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBRdWV1ZWRVbml0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5RVUVVRURfVU5JVDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzU3RyaWN0KCkgew0KKwkJcmV0dXJuIHN0cmljdDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFN0cmljdChib29sZWFuIG5ld1N0cmljdCkgew0KKwkJYm9vbGVhbiBvbGRTdHJpY3QgPSBzdHJpY3Q7DQorCQlzdHJpY3QgPSBuZXdTdHJpY3Q7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5RVUVVRURfVU5JVF9fU1RSSUNULCBvbGRTdHJpY3QsIHN0cmljdCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgaW5pdCgpIHsNCisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZA0KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlFVRVVFRF9VTklUX19TVFJJQ1Q6DQorCQkJCXJldHVybiBpc1N0cmljdCgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlFVRVVFRF9VTklUX19TVFJJQ1Q6DQorCQkJCXNldFN0cmljdCgoQm9vbGVhbiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlFVRVVFRF9VTklUX19TVFJJQ1Q6DQorCQkJCXNldFN0cmljdChTVFJJQ1RfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUVVFVUVEX1VOSVRfX1NUUklDVDoNCisJCQkJcmV0dXJuIHN0cmljdCAhPSBTVFJJQ1RfRURFRkFVTFQ7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiIChzdHJpY3Q6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChzdHJpY3QpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL1F1ZXVlZFVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvUmVmYWN0b3JpbmdVbml0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvUmVmYWN0b3JpbmdVbml0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjY2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9SZWZhY3RvcmluZ1VuaXRJbXBsLmphdmEKQEAgLTAsMCArMSwzMjYgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdW5kZWRSZWN0YW5nbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBwaW5nTGFiZWw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQ7DQoraW1wb3J0IGNvbXJlbC5TZXF1ZW50aWFsVW5pdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWZhY3RvcmluZyBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlJlZmFjdG9yaW5nVW5pdEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlJlZmFjdG9yaW5nVW5pdEltcGwjZ2V0U2VxRXhlY3V0aW9uT3JkZXIgPGVtPlNlcSBFeGVjdXRpb24gT3JkZXI8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZhY3RvcmluZ1VuaXRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZWZhY3RvcmluZ1VuaXQgew0KKwkNCisJcHVibGljIFJvdW5kZWRSZWN0YW5nbGUgZmlndXJlOw0KKwkNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE5hbWUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0TmFtZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxRXhlY3V0aW9uT3JkZXIoKSA8ZW0+U2VxIEV4ZWN1dGlvbiBPcmRlcjwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0U2VxRXhlY3V0aW9uT3JkZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRVFfRVhFQ1VUSU9OX09SREVSX0VERUZBVUxUID0gMDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcUV4ZWN1dGlvbk9yZGVyKCkgPGVtPlNlcSBFeGVjdXRpb24gT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNlcUV4ZWN1dGlvbk9yZGVyKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGludCBzZXFFeGVjdXRpb25PcmRlciA9IFNFUV9FWEVDVVRJT05fT1JERVJfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFJlZmFjdG9yaW5nVW5pdEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuUkVGQUNUT1JJTkdfVU5JVDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisJCXJldHVybiBuYW1lOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgew0KKwkJdGhpcy5zZXROYW1lKG5ld05hbWUsIHRydWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIGludCBnZXRTZXFFeGVjdXRpb25PcmRlcigpIHsNCisJCXJldHVybiBzZXFFeGVjdXRpb25PcmRlcjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldFNlcUV4ZWN1dGlvbk9yZGVyKGludCBuZXdTZXFFeGVjdXRpb25PcmRlcikgew0KKwkJaW50IG9sZFNlcUV4ZWN1dGlvbk9yZGVyID0gc2VxRXhlY3V0aW9uT3JkZXI7DQorCQl0aGlzLnNldFNlcUV4ZWN1dGlvbk9yZGVyKG5ld1NlcUV4ZWN1dGlvbk9yZGVyLA0KKwkJCQl0aGlzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0KTsNCisNCisNCisJCS8vIHNlcUV4ZWN1dGlvbk9yZGVyID0gbmV3U2VxRXhlY3V0aW9uT3JkZXI7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoDQorCQkJCQl0aGlzLA0KKwkJCQkJTm90aWZpY2F0aW9uLlNFVCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuUkVGQUNUT1JJTkdfVU5JVF9fU0VRX0VYRUNVVElPTl9PUkRFUiwNCisJCQkJCW9sZFNlcUV4ZWN1dGlvbk9yZGVyLCBzZXFFeGVjdXRpb25PcmRlcikpOw0KKwkJaWYoZmlndXJlICE9IG51bGwpIHsNCisJCQlzZXRGaWd1cmVMYWJlbCgiOiIrdGhpcy5nZXROYW1lKCkgKyAiIC0gIyIgKyB0aGlzLmdldFNlcUV4ZWN1dGlvbk9yZGVyKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PElucHV0UG9ydD4gZ2V0QWxsSW5wdXRQb3J0cygpIHsNCisJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZA0KKwkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QNCisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2VxRXhlY3V0aW9uT3JkZXIoaW50IHNlcUV4ZWN1dGlvbk9yZGVyLCBib29sZWFuIHN1cGVyQ2FsbCkgew0KKwkJaWYgKHN1cGVyQ2FsbCkgew0KKwkJCVNlcXVlbnRpYWxVbml0IHNlcVVuaXQgPSBudWxsOw0KKwkJCWlmICh0aGlzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFNlcXVlbnRpYWxVbml0KSB7DQorCQkJCXNlcVVuaXQgPSAoU2VxdWVudGlhbFVuaXQpIHRoaXMuZUNvbnRhaW5lcigpOw0KKwkJCX0NCisNCisJCQlpZiAoc2VxVW5pdCAhPSBudWxsKSB7DQorCQkJCWludCBsYXN0SW5kZXggPSBzZXFVbml0LmdldFJlZmFjdG9yaW5nVW5pdHMoKS5zaXplKCk7DQorCQkJCWJvb2xlYW4gY29uZGl0aW9uID0gc2VxRXhlY3V0aW9uT3JkZXIgPiAwOw0KKw0KKwkJCQljb25kaXRpb24gJj0gbGFzdEluZGV4ID49IHNlcUV4ZWN1dGlvbk9yZGVyOw0KKwkJCQlpZiAoY29uZGl0aW9uKSB7DQorCQkJCQlzZXFVbml0LmdldFJlZmFjdG9yaW5nVW5pdHMoKS5tb3ZlKHNlcUV4ZWN1dGlvbk9yZGVyIC0gMSwNCisJCQkJCQkJdGhpcyk7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlpZiAoc2VxRXhlY3V0aW9uT3JkZXIgPD0gMCkgew0KKwkJCQkJCXNlcVVuaXQuZ2V0UmVmYWN0b3JpbmdVbml0cygpLm1vdmUoMCwgdGhpcyk7DQorCQkJCQl9IGVsc2Ugew0KKwkJCQkJCXNlcVVuaXQuZ2V0UmVmYWN0b3JpbmdVbml0cygpLm1vdmUobGFzdEluZGV4IC0gMSwgdGhpcyk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJc2VxVW5pdC51cGRhdGVTZXFFeGVjdXRpb25PcmRlcigpOw0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJdGhpcy5zZXFFeGVjdXRpb25PcmRlciA9IHNlcUV4ZWN1dGlvbk9yZGVyOw0KKwkJfQ0KKwkJaWYoZmlndXJlICE9IG51bGwpIHsNCisJCQlzZXRGaWd1cmVMYWJlbCgiOiIrdGhpcy5nZXROYW1lKCkgKyAiIC0gIyIgKyB0aGlzLmdldFNlcUV4ZWN1dGlvbk9yZGVyKCkpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiB1cGRhdGVDb250YWluZXIpIHsNCisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsNCisJCW5hbWUgPSBuZXdOYW1lOw0KKwkJaWYgKHVwZGF0ZUNvbnRhaW5lcikgew0KKwkJCWlmICh0aGlzLmVDb250YWluZXIoKSAhPSBudWxsKSB7DQorCQkJCWlmICh0aGlzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlZmFjdG9yaW5nKSB7DQorCQkJCQkoKENvbXBvc2l0ZVJlZmFjdG9yaW5nKSB0aGlzLmVDb250YWluZXIoKSkuc2V0TmFtZShuZXdOYW1lLA0KKwkJCQkJCQlmYWxzZSk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwNCisJCQkJCUNvbXJlbFBhY2thZ2UuUkVGQUNUT1JJTkdfVU5JVF9fTkFNRSwgb2xkTmFtZSwNCisJCQkJCW5hbWUpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5SRUZBQ1RPUklOR19VTklUX19OQU1FOg0KKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5SRUZBQ1RPUklOR19VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSOg0KKwkJCQlyZXR1cm4gZ2V0U2VxRXhlY3V0aW9uT3JkZXIoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5SRUZBQ1RPUklOR19VTklUX19OQU1FOg0KKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlJFRkFDVE9SSU5HX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVI6DQorCQkJCXNldFNlcUV4ZWN1dGlvbk9yZGVyKChJbnRlZ2VyKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUkVGQUNUT1JJTkdfVU5JVF9fTkFNRToNCisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5SRUZBQ1RPUklOR19VTklUX19TRVFfRVhFQ1VUSU9OX09SREVSOg0KKwkJCQlzZXRTZXFFeGVjdXRpb25PcmRlcihTRVFfRVhFQ1VUSU9OX09SREVSX0VERUZBVUxUKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlJFRkFDVE9SSU5HX1VOSVRfX05BTUU6DQorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlJFRkFDVE9SSU5HX1VOSVRfX1NFUV9FWEVDVVRJT05fT1JERVI6DQorCQkJCXJldHVybiBzZXFFeGVjdXRpb25PcmRlciAhPSBTRVFfRVhFQ1VUSU9OX09SREVSX0VERUZBVUxUOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKG5hbWUpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBzZXFFeGVjdXRpb25PcmRlcjogIik7DQorCQlyZXN1bHQuYXBwZW5kKHNlcUV4ZWN1dGlvbk9yZGVyKTsNCisJCXJlc3VsdC5hcHBlbmQoJyknKTsNCisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCisJfQ0KKwkNCisJcHVibGljIFJvdW5kZWRSZWN0YW5nbGUgZ2V0RmlndXJlKCkgew0KKwkJcmV0dXJuIGZpZ3VyZTsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBzZXRGaWd1cmUoUm91bmRlZFJlY3RhbmdsZSBmaWd1cmUpIHsNCisJCXRoaXMuZmlndXJlID0gZmlndXJlOw0KKwkJc2V0RmlndXJlTGFiZWwoIjoiK3RoaXMuZ2V0RGVzYygpICsgIiAtICMiICsgdGhpcy5nZXRTZXFFeGVjdXRpb25PcmRlcigpKTsNCisJfQ0KKwkNCisJcHVibGljIFN0cmluZyBnZXREZXNjKCl7DQorCQlyZXR1cm4gIiI7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIHNldEZpZ3VyZUxhYmVsKFN0cmluZyB0ZXh0KSB7DQorCQlpZihmaWd1cmUhPW51bGwpew0KKwkJV3JhcHBpbmdMYWJlbCBsYWJlbCA9IChXcmFwcGluZ0xhYmVsKSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7DQorCQlsYWJlbC5zZXRUZXh0KHRleHQpOw0KKwkJfQ0KKwl9DQorDQorfSAvL1JlZmFjdG9yaW5nVW5pdEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TZXF1ZW50aWFsVW5pdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1NlcXVlbnRpYWxVbml0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YWZlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TZXF1ZW50aWFsVW5pdEltcGwuamF2YQpAQCAtMCwwICsxLDQwNCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuSGVscGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLklucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLlNlcXVlbnRpYWxVbml0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcXVlbnRpYWwgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TZXF1ZW50aWFsVW5pdEltcGwjZ2V0SGVscGVyVW5pdHMgPGVtPkhlbHBlciBVbml0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNlcXVlbnRpYWxVbml0SW1wbCNnZXRSZWZhY3RvcmluZ1VuaXRzIDxlbT5SZWZhY3RvcmluZyBVbml0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNlcXVlbnRpYWxVbml0SW1wbCNnZXRJbnB1dFBvcnRzIDxlbT5JbnB1dCBQb3J0czwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNlcXVlbnRpYWxVbml0SW1wbCNpc1N0cmljdCA8ZW0+U3RyaWN0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuU2VxdWVudGlhbFVuaXRJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TZXF1ZW50aWFsVW5pdEltcGwjZ2V0TGJsU3RyaWN0IDxlbT5MYmwgU3RyaWN0PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2VxdWVudGlhbFVuaXRJbXBsIGV4dGVuZHMgQ29tcG9zaXRlVW5pdEltcGwgaW1wbGVtZW50cyBTZXF1ZW50aWFsVW5pdCB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWxwZXJVbml0cygpIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0SGVscGVyVW5pdHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8SGVscGVyVW5pdD4gaGVscGVyVW5pdHM7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZhY3RvcmluZ1VuaXRzKCkgPGVtPlJlZmFjdG9yaW5nIFVuaXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFJlZmFjdG9yaW5nVW5pdHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8UmVmYWN0b3JpbmdVbml0PiByZWZhY3RvcmluZ1VuaXRzOw0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5wdXRQb3J0cygpIDxlbT5JbnB1dCBQb3J0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRJbnB1dFBvcnRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PElucHV0UG9ydD4gaW5wdXRQb3J0czsNCisNCisJLyoqDQorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0cmljdCgpIDxlbT5TdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2lzU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUUklDVF9FREVGQVVMVCA9IHRydWU7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0cmljdCgpIDxlbT5TdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2lzU3RyaWN0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0ID0gU1RSSUNUX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSAiU2VxdWVudGlhbCBVbml0IjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGJsU3RyaWN0KCkgPGVtPkxibCBTdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldExibFN0cmljdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExCTF9TVFJJQ1RfRURFRkFVTFQgPSAic3RyaWN0IjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExibFN0cmljdCgpIDxlbT5MYmwgU3RyaWN0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMYmxTdHJpY3QoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGxibFN0cmljdCA9IExCTF9TVFJJQ1RfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNlcXVlbnRpYWxVbml0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TRVFVRU5USUFMX1VOSVQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUxpc3Q8SGVscGVyVW5pdD4gZ2V0SGVscGVyVW5pdHMoKSB7DQorCQlpZiAoaGVscGVyVW5pdHMgPT0gbnVsbCkgew0KKwkJCWhlbHBlclVuaXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEhlbHBlclVuaXQ+KEhlbHBlclVuaXQuY2xhc3MsIHRoaXMsIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19IRUxQRVJfVU5JVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIGhlbHBlclVuaXRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEVMaXN0PFJlZmFjdG9yaW5nVW5pdD4gZ2V0UmVmYWN0b3JpbmdVbml0cygpIHsNCisJCWlmIChyZWZhY3RvcmluZ1VuaXRzID09IG51bGwpIHsNCisJCQlyZWZhY3RvcmluZ1VuaXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJlZmFjdG9yaW5nVW5pdD4oUmVmYWN0b3JpbmdVbml0LmNsYXNzLCB0aGlzLCBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFMpOw0KKwkJfQ0KKwkJcmV0dXJuIHJlZmFjdG9yaW5nVW5pdHM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUxpc3Q8SW5wdXRQb3J0PiBnZXRJbnB1dFBvcnRzKCkgew0KKwkJaWYgKGlucHV0UG9ydHMgPT0gbnVsbCkgew0KKwkJCWlucHV0UG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SW5wdXRQb3J0PihJbnB1dFBvcnQuY2xhc3MsIHRoaXMsIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19JTlBVVF9QT1JUUyk7DQorCQl9DQorCQlyZXR1cm4gaW5wdXRQb3J0czsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBib29sZWFuIGlzU3RyaWN0KCkgew0KKwkJcmV0dXJuIHN0cmljdDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQgTk9UDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTdHJpY3QoYm9vbGVhbiBuZXdTdHJpY3QpIHsNCisJCWJvb2xlYW4gb2xkU3RyaWN0ID0gc3RyaWN0Ow0KKwkJc3RyaWN0ID0gbmV3U3RyaWN0Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19TVFJJQ1QsIG9sZFN0cmljdCwgc3RyaWN0KSk7DQorCQlpZiAobmV3U3RyaWN0KSBzZXRMYmxTdHJpY3QoInN0cmljdCIpOw0KKwkJZWxzZSBzZXRMYmxTdHJpY3QoIm5vbiBzdHJpY3QiKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCisJCXJldHVybiB0eXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRMYmxTdHJpY3QoKSB7DQorCQlyZXR1cm4gbGJsU3RyaWN0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGJsU3RyaWN0KFN0cmluZyBuZXdMYmxTdHJpY3QpIHsNCisJCVN0cmluZyBvbGRMYmxTdHJpY3QgPSBsYmxTdHJpY3Q7DQorCQlsYmxTdHJpY3QgPSBuZXdMYmxTdHJpY3Q7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX0xCTF9TVFJJQ1QsIG9sZExibFN0cmljdCwgbGJsU3RyaWN0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCB1cGRhdGVTZXFFeGVjdXRpb25PcmRlcigpIHsNCisJCWludCBpbmRleDsNCisJCWZvcihSZWZhY3RvcmluZ1VuaXQgdW5pdCA6IHRoaXMuZ2V0UmVmYWN0b3JpbmdVbml0cygpKSB7DQorCQkJaW5kZXggPSB0aGlzLmdldFJlZmFjdG9yaW5nVW5pdHMoKS5pbmRleE9mKHVuaXQpKzE7DQorCQkJdW5pdC5zZXRTZXFFeGVjdXRpb25PcmRlcihpbmRleCxmYWxzZSk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGVscGVyVW5pdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVRTOg0KKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlZmFjdG9yaW5nVW5pdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldElucHV0UG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCQlyZXR1cm4gZ2V0SGVscGVyVW5pdHMoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19SRUZBQ1RPUklOR19VTklUUzoNCisJCQkJcmV0dXJuIGdldFJlZmFjdG9yaW5nVW5pdHMoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIGdldElucHV0UG9ydHMoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19TVFJJQ1Q6DQorCQkJCXJldHVybiBpc1N0cmljdCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX1RZUEU6DQorCQkJCXJldHVybiBnZXRUeXBlKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJcmV0dXJuIGdldExibFN0cmljdCgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJZ2V0SGVscGVyVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlnZXRIZWxwZXJVbml0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSGVscGVyVW5pdD4pbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFM6DQorCQkJCWdldFJlZmFjdG9yaW5nVW5pdHMoKS5jbGVhcigpOw0KKwkJCQlnZXRSZWZhY3RvcmluZ1VuaXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZWZhY3RvcmluZ1VuaXQ+KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX0lOUFVUX1BPUlRTOg0KKwkJCQlnZXRJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJZ2V0SW5wdXRQb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSW5wdXRQb3J0PiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19TVFJJQ1Q6DQorCQkJCXNldFN0cmljdCgoQm9vbGVhbiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19MQkxfU1RSSUNUOg0KKwkJCQlzZXRMYmxTdHJpY3QoKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCQlnZXRIZWxwZXJVbml0cygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19SRUZBQ1RPUklOR19VTklUUzoNCisJCQkJZ2V0UmVmYWN0b3JpbmdVbml0cygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19JTlBVVF9QT1JUUzoNCisJCQkJZ2V0SW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19TVFJJQ1Q6DQorCQkJCXNldFN0cmljdChTVFJJQ1RfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJc2V0TGJsU3RyaWN0KExCTF9TVFJJQ1RfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJCXJldHVybiBoZWxwZXJVbml0cyAhPSBudWxsICYmICFoZWxwZXJVbml0cy5pc0VtcHR5KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVFM6DQorCQkJCXJldHVybiByZWZhY3RvcmluZ1VuaXRzICE9IG51bGwgJiYgIXJlZmFjdG9yaW5nVW5pdHMuaXNFbXB0eSgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gaW5wdXRQb3J0cyAhPSBudWxsICYmICFpbnB1dFBvcnRzLmlzRW1wdHkoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUX19TVFJJQ1Q6DQorCQkJCXJldHVybiBzdHJpY3QgIT0gU1RSSUNUX0VERUZBVUxUOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TRVFVRU5USUFMX1VOSVRfX1RZUEU6DQorCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNFUVVFTlRJQUxfVU5JVF9fTEJMX1NUUklDVDoNCisJCQkJcmV0dXJuIExCTF9TVFJJQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGxibFN0cmljdCAhPSBudWxsIDogIUxCTF9TVFJJQ1RfRURFRkFVTFQuZXF1YWxzKGxibFN0cmljdCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiIChzdHJpY3Q6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChzdHJpY3QpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodHlwZSk7DQorCQlyZXN1bHQuYXBwZW5kKCIsIGxibFN0cmljdDogIik7DQorCQlyZXN1bHQuYXBwZW5kKGxibFN0cmljdCk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisJDQorCXB1YmxpYyBFTGlzdDxJbnB1dFBvcnQ+IGdldEFsbElucHV0UG9ydHMoKSB7DQorCQlyZXR1cm4gdGhpcy5nZXRJbnB1dFBvcnRzKCk7DQorCX0NCisNCit9IC8vU2VxdWVudGlhbFVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlRmVhdHVyZUhlbHBlckltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1NpbmdsZUZlYXR1cmVIZWxwZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViY2IzOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1NpbmdsZUZlYXR1cmVIZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVIZWxwZXJJbXBsI2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZUhlbHBlckltcGwgZXh0ZW5kcyBGZWF0dXJlSGVscGVySW1wbCBpbXBsZW1lbnRzIFNpbmdsZUZlYXR1cmVIZWxwZXIgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0UG9ydCgpIDxlbT5PdXRwdXQgUG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVPdXRwdXRQb3J0IG91dHB1dFBvcnQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUZlYXR1cmVIZWxwZXJJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GRUFUVVJFX0hFTFBFUjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKSB7DQorCQlyZXR1cm4gb3V0cHV0UG9ydDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlTaW5nbGVPdXRwdXRQb3J0IG9sZE91dHB1dFBvcnQgPSBvdXRwdXRQb3J0Ow0KKwkJb3V0cHV0UG9ydCA9IG5ld091dHB1dFBvcnQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JULCBvbGRPdXRwdXRQb3J0LCBuZXdPdXRwdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0KSB7DQorCQlpZiAobmV3T3V0cHV0UG9ydCAhPSBvdXRwdXRQb3J0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKG91dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dHB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdPdXRwdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPdXRwdXRQb3J0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRPdXRwdXRQb3J0KG5ld091dHB1dFBvcnQsIG1zZ3MpOw0KKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsNCisJCX0NCisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVCwgbmV3T3V0cHV0UG9ydCwgbmV3T3V0cHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBiYXNpY1NldE91dHB1dFBvcnQobnVsbCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJcmV0dXJuIGdldE91dHB1dFBvcnQoKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlzZXRPdXRwdXRQb3J0KChTaW5nbGVPdXRwdXRQb3J0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoU2luZ2xlT3V0cHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX0hFTFBFUl9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBvdXRwdXRQb3J0ICE9IG51bGw7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCit9IC8vU2luZ2xlRmVhdHVyZUhlbHBlckltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVGZWF0dXJlVW5pdEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1NpbmdsZUZlYXR1cmVVbml0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NzY2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVGZWF0dXJlVW5pdEltcGwuamF2YQpAQCAtMCwwICsxLDQyMiBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLk11bHRpSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmVhdHVyZUhlbHBlcjsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLnV0aWwuQ29tcmVsVXRpbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgRmVhdHVyZSBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVVbml0SW1wbCNnZXRJbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVGZWF0dXJlVW5pdEltcGwjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cyA8ZW0+U2Vjb25kYXJ5IElucHV0IFBvcnRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlRmVhdHVyZVVuaXRJbXBsI2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlRmVhdHVyZVVuaXRJbXBsI2dldFNpbmdsZUZlYXR1cmVIZWxwZXIgPGVtPlNpbmdsZSBGZWF0dXJlIEhlbHBlcjwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZUZlYXR1cmVVbml0SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmVhdHVyZVVuaXRJbXBsIGV4dGVuZHMgRmVhdHVyZVVuaXRJbXBsIGltcGxlbWVudHMgU2luZ2xlRmVhdHVyZVVuaXQgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5wdXRQb3J0KCkgPGVtPklucHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldElucHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVJbnB1dFBvcnQgaW5wdXRQb3J0Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpIDxlbT5TZWNvbmRhcnkgSW5wdXQgUG9ydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBFTGlzdDxNdWx0aUlucHV0UG9ydD4gc2Vjb25kYXJ5SW5wdXRQb3J0czsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dHB1dFBvcnQoKSA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE91dHB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlT3V0cHV0UG9ydCBvdXRwdXRQb3J0Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcigpIDxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNpbmdsZUZlYXR1cmVIZWxwZXIoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlRmVhdHVyZUhlbHBlciBzaW5nbGVGZWF0dXJlSGVscGVyOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSAiU2luZ2xlIEZlYXR1cmUgVW5pdCI7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFR5cGUoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOw0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVGZWF0dXJlVW5pdEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCXB1YmxpYyBTaW5nbGVGZWF0dXJlVW5pdEltcGwoU2luZ2xlRmVhdHVyZUhlbHBlciBoZWxwZXIpIHsNCisJCXRoaXMuc2luZ2xlRmVhdHVyZUhlbHBlciA9IGhlbHBlcjsNCisJCXRoaXMubmFtZSA9IGhlbHBlci5nZXROYW1lKCk7DQorCQl0aGlzLmhlbHBlclVuaXRJZCA9IGhlbHBlci5nZXRIZWxwZXJJZCgpOw0KKwkJdGhpcy5kZXNjcmlwdGlvbiA9IGhlbHBlci5nZXREZXNjcmlwdGlvbigpOw0KKwkJdGhpcy5uYW1lc3BhY2VVcmkgPSBoZWxwZXIuZ2V0TmFtZXNwYWNlVXJpKCk7DQorCQlTaW5nbGVJbnB1dFBvcnQgaW5wdXRQb3J0ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2luZ2xlSW5wdXRQb3J0KCk7DQorCQlTaW5nbGVPdXRwdXRQb3J0IG91dHB1dFBvcnQgPSBDb21yZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCk7DQorCQlpbnB1dFBvcnQuc2V0RGVzY3JpcHRpb24oaGVscGVyLmdldElucHV0UG9ydCgpLmdldERlc2NyaXB0aW9uKCkpOw0KKwkJaW5wdXRQb3J0LnNldE5hbWUoaGVscGVyLmdldElucHV0UG9ydCgpLmdldE5hbWUoKSk7DQorCQlpbnB1dFBvcnQuc2V0VHlwZShoZWxwZXIuZ2V0SW5wdXRQb3J0KCkuZ2V0VHlwZSgpKTsNCisNCisJCXRoaXMuc2V0SW5wdXRQb3J0KGlucHV0UG9ydCk7DQorCQlvdXRwdXRQb3J0LnNldERlc2NyaXB0aW9uKGhlbHBlci5nZXRPdXRwdXRQb3J0KCkuZ2V0RGVzY3JpcHRpb24oKSk7DQorCQlvdXRwdXRQb3J0LnNldE5hbWUoaGVscGVyLmdldE91dHB1dFBvcnQoKS5nZXROYW1lKCkpOw0KKwkJb3V0cHV0UG9ydC5zZXRUeXBlKGhlbHBlci5nZXRPdXRwdXRQb3J0KCkuZ2V0VHlwZSgpKTsNCisNCisJCXRoaXMuc2V0T3V0cHV0UG9ydChvdXRwdXRQb3J0KTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9GRUFUVVJFX1VOSVQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0IGdldElucHV0UG9ydCgpIHsNCisJCXJldHVybiBpbnB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IG5ld0lucHV0UG9ydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJU2luZ2xlSW5wdXRQb3J0IG9sZElucHV0UG9ydCA9IGlucHV0UG9ydDsNCisJCWlucHV0UG9ydCA9IG5ld0lucHV0UG9ydDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQsIG9sZElucHV0UG9ydCwgbmV3SW5wdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldElucHV0UG9ydChTaW5nbGVJbnB1dFBvcnQgbmV3SW5wdXRQb3J0KSB7DQorCQlpZiAobmV3SW5wdXRQb3J0ICE9IGlucHV0UG9ydCkgew0KKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOw0KKwkJCWlmIChpbnB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWlucHV0UG9ydCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld0lucHV0UG9ydCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5wdXRQb3J0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRJbnB1dFBvcnQobmV3SW5wdXRQb3J0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQsIG5ld0lucHV0UG9ydCwgbmV3SW5wdXRQb3J0KSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgRUxpc3Q8TXVsdGlJbnB1dFBvcnQ+IGdldFNlY29uZGFyeUlucHV0UG9ydHMoKSB7DQorCQlpZiAoc2Vjb25kYXJ5SW5wdXRQb3J0cyA9PSBudWxsKSB7DQorCQkJc2Vjb25kYXJ5SW5wdXRQb3J0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNdWx0aUlucHV0UG9ydD4oTXVsdGlJbnB1dFBvcnQuY2xhc3MsIHRoaXMsIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fU0VDT05EQVJZX0lOUFVUX1BPUlRTKTsNCisJCX0NCisJCXJldHVybiBzZWNvbmRhcnlJbnB1dFBvcnRzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZU91dHB1dFBvcnQgZ2V0T3V0cHV0UG9ydCgpIHsNCisJCXJldHVybiBvdXRwdXRQb3J0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0cHV0UG9ydChTaW5nbGVPdXRwdXRQb3J0IG5ld091dHB1dFBvcnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCVNpbmdsZU91dHB1dFBvcnQgb2xkT3V0cHV0UG9ydCA9IG91dHB1dFBvcnQ7DQorCQlvdXRwdXRQb3J0ID0gbmV3T3V0cHV0UG9ydDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JULCBvbGRPdXRwdXRQb3J0LCBuZXdPdXRwdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0KSB7DQorCQlpZiAobmV3T3V0cHV0UG9ydCAhPSBvdXRwdXRQb3J0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKG91dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dHB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQlpZiAobmV3T3V0cHV0UG9ydCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3V0cHV0UG9ydCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fT1VUUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCW1zZ3MgPSBiYXNpY1NldE91dHB1dFBvcnQobmV3T3V0cHV0UG9ydCwgbXNncyk7DQorCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOw0KKwkJfQ0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVCwgbmV3T3V0cHV0UG9ydCwgbmV3T3V0cHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZlYXR1cmVIZWxwZXIgZ2V0U2luZ2xlRmVhdHVyZUhlbHBlcigpIHsNCisJCWlmIChzaW5nbGVGZWF0dXJlSGVscGVyICE9IG51bGwgJiYgc2luZ2xlRmVhdHVyZUhlbHBlci5lSXNQcm94eSgpKSB7DQorCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNpbmdsZUZlYXR1cmVIZWxwZXIgPSAoSW50ZXJuYWxFT2JqZWN0KXNpbmdsZUZlYXR1cmVIZWxwZXI7DQorCQkJc2luZ2xlRmVhdHVyZUhlbHBlciA9IChTaW5nbGVGZWF0dXJlSGVscGVyKWVSZXNvbHZlUHJveHkob2xkU2luZ2xlRmVhdHVyZUhlbHBlcik7DQorCQkJaWYgKHNpbmdsZUZlYXR1cmVIZWxwZXIgIT0gb2xkU2luZ2xlRmVhdHVyZUhlbHBlcikgew0KKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19TSU5HTEVfRkVBVFVSRV9IRUxQRVIsIG9sZFNpbmdsZUZlYXR1cmVIZWxwZXIsIHNpbmdsZUZlYXR1cmVIZWxwZXIpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmVhdHVyZUhlbHBlcjsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVGZWF0dXJlSGVscGVyIGJhc2ljR2V0U2luZ2xlRmVhdHVyZUhlbHBlcigpIHsNCisJCXJldHVybiBzaW5nbGVGZWF0dXJlSGVscGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U2luZ2xlRmVhdHVyZUhlbHBlcihTaW5nbGVGZWF0dXJlSGVscGVyIG5ld1NpbmdsZUZlYXR1cmVIZWxwZXIpIHsNCisJCWlmKENvbXJlbFV0aWwub2JqZWN0SXNTZXR0YWJsZSh0aGlzKSB8fCB0aGlzLnNpbmdsZUZlYXR1cmVIZWxwZXI9PW51bGwpew0KKwkJCVNpbmdsZUZlYXR1cmVIZWxwZXIgb2xkU2luZ2xlRmVhdHVyZUhlbHBlciA9IHNpbmdsZUZlYXR1cmVIZWxwZXI7DQorCQkJc2luZ2xlRmVhdHVyZUhlbHBlciA9IG5ld1NpbmdsZUZlYXR1cmVIZWxwZXI7DQorCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX1NJTkdMRV9GRUFUVVJFX0hFTFBFUiwgb2xkU2luZ2xlRmVhdHVyZUhlbHBlciwgc2luZ2xlRmVhdHVyZUhlbHBlcikpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KKwkJcmV0dXJuIHR5cGU7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGJhc2ljU2V0SW5wdXRQb3J0KG51bGwsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19TRUNPTkRBUllfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gYmFzaWNTZXRPdXRwdXRQb3J0KG51bGwsIG1zZ3MpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX0lOUFVUX1BPUlQ6DQorCQkJCXJldHVybiBnZXRJbnB1dFBvcnQoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fU0VDT05EQVJZX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJcmV0dXJuIGdldE91dHB1dFBvcnQoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fU0lOR0xFX0ZFQVRVUkVfSEVMUEVSOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNpbmdsZUZlYXR1cmVIZWxwZXIoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0U2luZ2xlRmVhdHVyZUhlbHBlcigpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUOg0KKwkJCQlzZXRJbnB1dFBvcnQoKFNpbmdsZUlucHV0UG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fU0VDT05EQVJZX0lOUFVUX1BPUlRTOg0KKwkJCQlnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJZ2V0U2Vjb25kYXJ5SW5wdXRQb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTXVsdGlJbnB1dFBvcnQ+KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoU2luZ2xlT3V0cHV0UG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fU0lOR0xFX0ZFQVRVUkVfSEVMUEVSOg0KKwkJCQlzZXRTaW5nbGVGZWF0dXJlSGVscGVyKChTaW5nbGVGZWF0dXJlSGVscGVyKW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJc2V0SW5wdXRQb3J0KChTaW5nbGVJbnB1dFBvcnQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVF9fU0VDT05EQVJZX0lOUFVUX1BPUlRTOg0KKwkJCQlnZXRTZWNvbmRhcnlJbnB1dFBvcnRzKCkuY2xlYXIoKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoU2luZ2xlT3V0cHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19TSU5HTEVfRkVBVFVSRV9IRUxQRVI6DQorCQkJCXNldFNpbmdsZUZlYXR1cmVIZWxwZXIoKFNpbmdsZUZlYXR1cmVIZWxwZXIpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19JTlBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gaW5wdXRQb3J0ICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX1NFQ09OREFSWV9JTlBVVF9QT1JUUzoNCisJCQkJcmV0dXJuIHNlY29uZGFyeUlucHV0UG9ydHMgIT0gbnVsbCAmJiAhc2Vjb25kYXJ5SW5wdXRQb3J0cy5pc0VtcHR5KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gb3V0cHV0UG9ydCAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9VTklUX19TSU5HTEVfRkVBVFVSRV9IRUxQRVI6DQorCQkJCXJldHVybiBzaW5nbGVGZWF0dXJlSGVscGVyICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GRUFUVVJFX1VOSVRfX1RZUEU6DQorCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKwkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodHlwZSk7DQorCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorCX0NCisNCit9IC8vU2luZ2xlRmVhdHVyZVVuaXRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlRmlsdGVySGVscGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlRmlsdGVySGVscGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODEzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVGaWx0ZXJIZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVPdXRwdXRQb3J0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVGaWx0ZXJIZWxwZXJJbXBsI2dldE91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlRmlsdGVySGVscGVySW1wbCBleHRlbmRzIEZpbHRlckhlbHBlckltcGwgaW1wbGVtZW50cyBTaW5nbGVGaWx0ZXJIZWxwZXIgew0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0UG9ydCgpIDxlbT5PdXRwdXQgUG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVPdXRwdXRQb3J0IG91dHB1dFBvcnQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUZpbHRlckhlbHBlckltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX0ZJTFRFUl9IRUxQRVI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlT3V0cHV0UG9ydCBnZXRPdXRwdXRQb3J0KCkgew0KKwkJcmV0dXJuIG91dHB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPdXRwdXRQb3J0KFNpbmdsZU91dHB1dFBvcnQgbmV3T3V0cHV0UG9ydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJU2luZ2xlT3V0cHV0UG9ydCBvbGRPdXRwdXRQb3J0ID0gb3V0cHV0UG9ydDsNCisJCW91dHB1dFBvcnQgPSBuZXdPdXRwdXRQb3J0Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7DQorCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JULCBvbGRPdXRwdXRQb3J0LCBuZXdPdXRwdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0KSB7DQorCQlpZiAobmV3T3V0cHV0UG9ydCAhPSBvdXRwdXRQb3J0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKG91dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dHB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJaWYgKG5ld091dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dHB1dFBvcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJbXNncyA9IGJhc2ljU2V0T3V0cHV0UG9ydChuZXdPdXRwdXRQb3J0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVCwgbmV3T3V0cHV0UG9ydCwgbmV3T3V0cHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfSEVMUEVSX19PVVRQVVRfUE9SVDoNCisJCQkJcmV0dXJuIGJhc2ljU2V0T3V0cHV0UG9ydChudWxsLCBtc2dzKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX0hFTFBFUl9fT1VUUFVUX1BPUlQ6DQorCQkJCXJldHVybiBnZXRPdXRwdXRQb3J0KCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlzZXRPdXRwdXRQb3J0KChTaW5nbGVPdXRwdXRQb3J0KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlzZXRPdXRwdXRQb3J0KChTaW5nbGVPdXRwdXRQb3J0KW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9IRUxQRVJfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gb3V0cHV0UG9ydCAhPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorfSAvL1NpbmdsZUZpbHRlckhlbHBlckltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVGaWx0ZXJVbml0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlRmlsdGVyVW5pdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzYzNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlRmlsdGVyVW5pdEltcGwuamF2YQpAQCAtMCwwICsxLDM3OSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbEZhY3Rvcnk7DQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLnV0aWwuQ29tcmVsVXRpbDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgRmlsdGVyIFVuaXQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlRmlsdGVyVW5pdEltcGwjZ2V0SW5wdXRQb3J0IDxlbT5JbnB1dCBQb3J0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlRmlsdGVyVW5pdEltcGwjZ2V0T3V0cHV0UG9ydCA8ZW0+T3V0cHV0IFBvcnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVGaWx0ZXJVbml0SW1wbCNnZXRTaW5nbGVGaWx0ZXJIZWxwZXIgPGVtPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlRmlsdGVyVW5pdEltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUZpbHRlclVuaXRJbXBsIGV4dGVuZHMgRmlsdGVyVW5pdEltcGwgaW1wbGVtZW50cyBTaW5nbGVGaWx0ZXJVbml0IHsNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElucHV0UG9ydCgpIDxlbT5JbnB1dCBQb3J0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRJbnB1dFBvcnQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgTXVsdGlJbnB1dFBvcnQgaW5wdXRQb3J0Ow0KKw0KKwkvKioNCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0UG9ydCgpIDxlbT5PdXRwdXQgUG9ydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0T3V0cHV0UG9ydCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVPdXRwdXRQb3J0IG91dHB1dFBvcnQ7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKSA8ZW0+U2luZ2xlIEZpbHRlciBIZWxwZXI8L2VtPn0nIHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldFNpbmdsZUZpbHRlckhlbHBlcigpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVGaWx0ZXJIZWxwZXIgc2luZ2xlRmlsdGVySGVscGVyOw0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSAiU2luZ2xlIEZpbHRlciBVbml0IjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUZpbHRlclVuaXRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwlwdWJsaWMgU2luZ2xlRmlsdGVyVW5pdEltcGwoU2luZ2xlRmlsdGVySGVscGVyIGhlbHBlcikgew0KKwkJdGhpcy5zaW5nbGVGaWx0ZXJIZWxwZXIgPSBoZWxwZXI7DQorCQl0aGlzLmhlbHBlclVuaXRJZCA9IGhlbHBlci5nZXRIZWxwZXJJZCgpOw0KKwkJdGhpcy5uYW1lID0gaGVscGVyLmdldE5hbWUoKTsNCisJCXRoaXMuZGVzY3JpcHRpb24gPSBoZWxwZXIuZ2V0RGVzY3JpcHRpb24oKTsNCisJCXRoaXMubmFtZXNwYWNlVXJpID0gaGVscGVyLmdldE5hbWVzcGFjZVVyaSgpOw0KKwkJU2luZ2xlT3V0cHV0UG9ydCBvdXRQb3J0ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2luZ2xlT3V0cHV0UG9ydCgpOw0KKwkJTXVsdGlJbnB1dFBvcnQgaW5Qb3J0ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTXVsdGlJbnB1dFBvcnQoKTsNCisJCWluUG9ydC5zZXREZXNjcmlwdGlvbihoZWxwZXIuZ2V0SW5wdXRQb3J0KCkuZ2V0RGVzY3JpcHRpb24oKSk7DQorCQlpblBvcnQuc2V0TmFtZShoZWxwZXIuZ2V0SW5wdXRQb3J0KCkuZ2V0TmFtZSgpKTsNCisJCWluUG9ydC5zZXRUeXBlKGhlbHBlci5nZXRJbnB1dFBvcnQoKS5nZXRUeXBlKCkpOw0KKw0KKwkJdGhpcy5zZXRJbnB1dFBvcnQoaW5Qb3J0KTsNCisJCW91dFBvcnQuc2V0RGVzY3JpcHRpb24oaGVscGVyLmdldE91dHB1dFBvcnQoKS5nZXREZXNjcmlwdGlvbigpKTsNCisJCW91dFBvcnQuc2V0TmFtZShoZWxwZXIuZ2V0T3V0cHV0UG9ydCgpLmdldE5hbWUoKSk7DQorCQlvdXRQb3J0LnNldFR5cGUoaGVscGVyLmdldE91dHB1dFBvcnQoKS5nZXRUeXBlKCkpOw0KKw0KKwkJdGhpcy5zZXRPdXRwdXRQb3J0KG91dFBvcnQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX0ZJTFRFUl9VTklUOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIE11bHRpSW5wdXRQb3J0IGdldElucHV0UG9ydCgpIHsNCisJCXJldHVybiBpbnB1dFBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnB1dFBvcnQoTXVsdGlJbnB1dFBvcnQgbmV3SW5wdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlNdWx0aUlucHV0UG9ydCBvbGRJbnB1dFBvcnQgPSBpbnB1dFBvcnQ7DQorCQlpbnB1dFBvcnQgPSBuZXdJbnB1dFBvcnQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQsIG9sZElucHV0UG9ydCwgbmV3SW5wdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldElucHV0UG9ydChNdWx0aUlucHV0UG9ydCBuZXdJbnB1dFBvcnQpIHsNCisJCWlmIChuZXdJbnB1dFBvcnQgIT0gaW5wdXRQb3J0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKGlucHV0UG9ydCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5wdXRQb3J0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdJbnB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0lucHV0UG9ydCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19JTlBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRJbnB1dFBvcnQobmV3SW5wdXRQb3J0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVCwgbmV3SW5wdXRQb3J0LCBuZXdJbnB1dFBvcnQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVPdXRwdXRQb3J0IGdldE91dHB1dFBvcnQoKSB7DQorCQlyZXR1cm4gb3V0cHV0UG9ydDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlTaW5nbGVPdXRwdXRQb3J0IG9sZE91dHB1dFBvcnQgPSBvdXRwdXRQb3J0Ow0KKwkJb3V0cHV0UG9ydCA9IG5ld091dHB1dFBvcnQ7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsNCisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JULCBvbGRPdXRwdXRQb3J0LCBuZXdPdXRwdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBuZXdPdXRwdXRQb3J0KSB7DQorCQlpZiAobmV3T3V0cHV0UG9ydCAhPSBvdXRwdXRQb3J0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKG91dHB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dHB1dFBvcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fT1VUUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdPdXRwdXRQb3J0ICE9IG51bGwpDQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPdXRwdXRQb3J0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRPdXRwdXRQb3J0KG5ld091dHB1dFBvcnQsIG1zZ3MpOw0KKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsNCisJCX0NCisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVCwgbmV3T3V0cHV0UG9ydCwgbmV3T3V0cHV0UG9ydCkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlckhlbHBlciBnZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKSB7DQorCQlpZiAoc2luZ2xlRmlsdGVySGVscGVyICE9IG51bGwgJiYgc2luZ2xlRmlsdGVySGVscGVyLmVJc1Byb3h5KCkpIHsNCisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2luZ2xlRmlsdGVySGVscGVyID0gKEludGVybmFsRU9iamVjdClzaW5nbGVGaWx0ZXJIZWxwZXI7DQorCQkJc2luZ2xlRmlsdGVySGVscGVyID0gKFNpbmdsZUZpbHRlckhlbHBlcillUmVzb2x2ZVByb3h5KG9sZFNpbmdsZUZpbHRlckhlbHBlcik7DQorCQkJaWYgKHNpbmdsZUZpbHRlckhlbHBlciAhPSBvbGRTaW5nbGVGaWx0ZXJIZWxwZXIpIHsNCisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19TSU5HTEVfRklMVEVSX0hFTFBFUiwgb2xkU2luZ2xlRmlsdGVySGVscGVyLCBzaW5nbGVGaWx0ZXJIZWxwZXIpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlRmlsdGVySGVscGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZUZpbHRlckhlbHBlciBiYXNpY0dldFNpbmdsZUZpbHRlckhlbHBlcigpIHsNCisJCXJldHVybiBzaW5nbGVGaWx0ZXJIZWxwZXI7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzZXRTaW5nbGVGaWx0ZXJIZWxwZXIoU2luZ2xlRmlsdGVySGVscGVyIG5ld1NpbmdsZUZpbHRlckhlbHBlcikgew0KKwkJaWYoQ29tcmVsVXRpbC5vYmplY3RJc1NldHRhYmxlKHRoaXMpIHx8IHNpbmdsZUZpbHRlckhlbHBlciA9PSBudWxsKXsNCisJCQlTaW5nbGVGaWx0ZXJIZWxwZXIgb2xkU2luZ2xlRmlsdGVySGVscGVyID0gc2luZ2xlRmlsdGVySGVscGVyOw0KKwkJCXNpbmdsZUZpbHRlckhlbHBlciA9IG5ld1NpbmdsZUZpbHRlckhlbHBlcjsNCisJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19TSU5HTEVfRklMVEVSX0hFTFBFUiwgb2xkU2luZ2xlRmlsdGVySGVscGVyLCBzaW5nbGVGaWx0ZXJIZWxwZXIpKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCisJCXJldHVybiB0eXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGJhc2ljU2V0SW5wdXRQb3J0KG51bGwsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gYmFzaWNTZXRPdXRwdXRQb3J0KG51bGwsIG1zZ3MpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGdldElucHV0UG9ydCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gZ2V0T3V0cHV0UG9ydCgpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX1NJTkdMRV9GSUxURVJfSEVMUEVSOg0KKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNpbmdsZUZpbHRlckhlbHBlcigpOw0KKwkJCQlyZXR1cm4gYmFzaWNHZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gZ2V0VHlwZSgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJc2V0SW5wdXRQb3J0KChNdWx0aUlucHV0UG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoU2luZ2xlT3V0cHV0UG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19TSU5HTEVfRklMVEVSX0hFTFBFUjoNCisJCQkJc2V0U2luZ2xlRmlsdGVySGVscGVyKChTaW5nbGVGaWx0ZXJIZWxwZXIpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX0lOUFVUX1BPUlQ6DQorCQkJCXNldElucHV0UG9ydCgoTXVsdGlJbnB1dFBvcnQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9VTklUX19PVVRQVVRfUE9SVDoNCisJCQkJc2V0T3V0cHV0UG9ydCgoU2luZ2xlT3V0cHV0UG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX1NJTkdMRV9GSUxURVJfSEVMUEVSOg0KKwkJCQlzZXRTaW5nbGVGaWx0ZXJIZWxwZXIoKFNpbmdsZUZpbHRlckhlbHBlciludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJfQ0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGlucHV0UG9ydCAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX09VVFBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gb3V0cHV0UG9ydCAhPSBudWxsOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVRfX1NJTkdMRV9GSUxURVJfSEVMUEVSOg0KKwkJCQlyZXR1cm4gc2luZ2xlRmlsdGVySGVscGVyICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9GSUxURVJfVU5JVF9fVFlQRToNCisJCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZCh0eXBlKTsNCisJCXJlc3VsdC5hcHBlbmQoJyknKTsNCisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCisJfQ0KKw0KK30gLy9TaW5nbGVGaWx0ZXJVbml0SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1NpbmdsZUlucHV0UG9ydEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1NpbmdsZUlucHV0UG9ydEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWIxMmViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlSW5wdXRQb3J0SW1wbC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLlBvcnRNYXBwaW5nOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlSW5wdXRQb3J0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNpbmdsZSBJbnB1dCBQb3J0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIFNpbmdsZUlucHV0UG9ydEltcGwgZXh0ZW5kcyBTaW5nbGVQb3J0SW1wbCBpbXBsZW1lbnRzIFNpbmdsZUlucHV0UG9ydCB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZUlucHV0UG9ydEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX0lOUFVUX1BPUlQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQm9vbGVhbiBpc01hcHBpbmdUYXJnZXQoKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9IHRoaXMuZUNvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSByZXR1cm4gdHJ1ZTsNCisJCXdoaWxlKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgIT0gbnVsbCkgew0KKwkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7DQorCQl9DQorCQlDb21wb3NpdGVSZWZhY3RvcmluZyByZWZTeXM7DQorCQlpZihjb250YWluZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCXJlZlN5cyA9IChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb250YWluZXIgJ1JlZmFjdG9yaW5nU3lzdGVtJyBkb2Vzbid0IGV4aXN0cyIpOw0KKwkJfQ0KKwkJRUxpc3Q8UG9ydE1hcHBpbmc+IG1hcHBpbmdzID0gcmVmU3lzLmdldFBvcnRNYXBwaW5ncygpOw0KKwkJZm9yKFBvcnRNYXBwaW5nIG0gOiBtYXBwaW5ncykgew0KKwkJCWlmKG0uZ2V0VGFyZ2V0KCkgPT0gdGhpcykgew0KKwkJCQlyZXR1cm4gdHJ1ZTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQm9vbGVhbiBpc1Jvb3RQb3J0KCkgew0KKwkJRU9iamVjdCBjb250YWluZXIgPSB0aGlzLmVDb250YWluZXIoKTsNCisJCWlmIChjb250YWluZXIgPT0gbnVsbCkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb250YWluZXIgZG9lc24ndCBleGlzdHMiKTsNCisJCWlmKGNvbnRhaW5lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSZWZhY3RvcmluZykgew0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJZWxzZSB7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0KKwl9DQorDQorfSAvL1NpbmdsZUlucHV0UG9ydEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVPdXRwdXRQb3J0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlT3V0cHV0UG9ydEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmRkNjhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlT3V0cHV0UG9ydEltcGwuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxQYWNrYWdlOw0KK2ltcG9ydCBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW5nbGUgT3V0cHV0IFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgU2luZ2xlT3V0cHV0UG9ydEltcGwgZXh0ZW5kcyBTaW5nbGVQb3J0SW1wbCBpbXBsZW1lbnRzIFNpbmdsZU91dHB1dFBvcnQgew0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBTaW5nbGVPdXRwdXRQb3J0SW1wbCgpIHsNCisJCXN1cGVyKCk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorCQlyZXR1cm4gQ29tcmVsUGFja2FnZS5MaXRlcmFscy5TSU5HTEVfT1VUUFVUX1BPUlQ7DQorCX0NCisNCit9IC8vU2luZ2xlT3V0cHV0UG9ydEltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVQb3J0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlUG9ydEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIwODliCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlUG9ydEltcGwuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZCQNCisgKi8NCitwYWNrYWdlIGNvbXJlbC5pbXBsOw0KKw0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVBvcnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIFBvcnQ8L2I+PC9lbT4nLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIDxwPg0KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KKyAqIDx1bD4NCisgKiAgIDxsaT57QGxpbmsgY29tcmVsLmltcGwuU2luZ2xlUG9ydEltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlUG9ydEltcGwgZXh0ZW5kcyBQb3J0SW1wbCBpbXBsZW1lbnRzIFNpbmdsZVBvcnQgew0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0VERUZBVUxUID0gbnVsbDsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRWYWx1ZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBPYmplY3QgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlUG9ydEltcGwoKSB7DQorCQlzdXBlcigpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KKwkJcmV0dXJuIENvbXJlbFBhY2thZ2UuTGl0ZXJhbHMuU0lOR0xFX1BPUlQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgew0KKwkJcmV0dXJuIHZhbHVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IG5ld1ZhbHVlKSB7DQorCQlPYmplY3Qgb2xkVmFsdWUgPSB2YWx1ZTsNCisJCXZhbHVlID0gbmV3VmFsdWU7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TSU5HTEVfUE9SVF9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX19WQUxVRToNCisJCQkJcmV0dXJuIGdldFZhbHVlKCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1BPUlRfX1ZBTFVFOg0KKwkJCQlzZXRWYWx1ZShuZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX19WQUxVRToNCisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1BPUlRfX1ZBTFVFOg0KKwkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsNCisJCX0NCisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KKw0KKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQorCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsNCisJCXJlc3VsdC5hcHBlbmQodmFsdWUpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorDQorfSAvL1NpbmdsZVBvcnRJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlUG9ydE1hcHBpbmdJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVQb3J0TWFwcGluZ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzNiYjRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL2ltcGwvU2luZ2xlUG9ydE1hcHBpbmdJbXBsLmphdmEKQEAgLTAsMCArMSwyNDUgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVQb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmc7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIFBvcnQgTWFwcGluZzwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVQb3J0TWFwcGluZ0ltcGwjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVQb3J0TWFwcGluZ0ltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVQb3J0TWFwcGluZ0ltcGwgZXh0ZW5kcyBQb3J0TWFwcGluZ0ltcGwgaW1wbGVtZW50cyBTaW5nbGVQb3J0TWFwcGluZyB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2UoKSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRTb3VyY2UoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlUG9ydCBzb3VyY2U7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXQoKSA8ZW0+VGFyZ2V0PC9lbT59JyByZWZlcmVuY2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRUYXJnZXQoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlSW5wdXRQb3J0IHRhcmdldDsNCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU2luZ2xlUG9ydE1hcHBpbmdJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9QT1JUX01BUFBJTkc7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlUG9ydCBnZXRTb3VyY2UoKSB7DQorCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmVJc1Byb3h5KCkpIHsNCisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkU291cmNlID0gKEludGVybmFsRU9iamVjdClzb3VyY2U7DQorCQkJc291cmNlID0gKFNpbmdsZVBvcnQpZVJlc29sdmVQcm94eShvbGRTb3VyY2UpOw0KKwkJCWlmIChzb3VyY2UgIT0gb2xkU291cmNlKSB7DQorCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX01BUFBJTkdfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gc291cmNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFNpbmdsZVBvcnQgYmFzaWNHZXRTb3VyY2UoKSB7DQorCQlyZXR1cm4gc291cmNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0U291cmNlKFNpbmdsZVBvcnQgbmV3U291cmNlKSB7DQorCQl0aGlzLnJlc2V0VmlzdWFsaXphdGlvbigpOw0KKwkJU2luZ2xlUG9ydCBvbGRTb3VyY2UgPSBzb3VyY2U7DQorCQlzb3VyY2UgPSBuZXdTb3VyY2U7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TSU5HTEVfUE9SVF9NQVBQSU5HX19TT1VSQ0UsIG9sZFNvdXJjZSwgc291cmNlKSk7DQorCQlpZihzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCl7DQorCQkJaWYgKHNvdXJjZS5nZXRUeXBlKCkgIT0gbnVsbCkgew0KKwkJCQl1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyhzb3VyY2UuZ2V0VHlwZSgpLHNvdXJjZS5nZXRTaW5ndWxhclBvcnROYW1lKCkpOw0KKwkJCX0gZWxzZSB7DQorCQkJCXVwZGF0ZVBvcnRUeXBlc0FuZE5hbWVzKHRhcmdldC5nZXRUeXBlKCksdGFyZ2V0LmdldFNpbmd1bGFyUG9ydE5hbWUoKSk7DQorCQkJfQ0KKwkJCXVwZGF0ZU1hcHBpbmdOdW1iZXIoKTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXRoaXMudXBkYXRlQ1JWaXN1YWxpemF0aW9uKCk7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgU2luZ2xlSW5wdXRQb3J0IGdldFRhcmdldCgpIHsNCisJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZUlzUHJveHkoKSkgew0KKwkJCUludGVybmFsRU9iamVjdCBvbGRUYXJnZXQgPSAoSW50ZXJuYWxFT2JqZWN0KXRhcmdldDsNCisJCQl0YXJnZXQgPSAoU2luZ2xlSW5wdXRQb3J0KWVSZXNvbHZlUHJveHkob2xkVGFyZ2V0KTsNCisJCQlpZiAodGFyZ2V0ICE9IG9sZFRhcmdldCkgew0KKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ29tcmVsUGFja2FnZS5TSU5HTEVfUE9SVF9NQVBQSU5HX19UQVJHRVQsIG9sZFRhcmdldCwgdGFyZ2V0KSk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHRhcmdldDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTaW5nbGVJbnB1dFBvcnQgYmFzaWNHZXRUYXJnZXQoKSB7DQorCQlyZXR1cm4gdGFyZ2V0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0KFNpbmdsZUlucHV0UG9ydCBuZXdUYXJnZXQpIHsNCisJCXRoaXMucmVzZXRWaXN1YWxpemF0aW9uKCk7DQorCQlTaW5nbGVJbnB1dFBvcnQgb2xkVGFyZ2V0ID0gdGFyZ2V0Ow0KKwkJdGFyZ2V0ID0gbmV3VGFyZ2V0Ow0KKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuU0lOR0xFX1BPUlRfTUFQUElOR19fVEFSR0VULCBvbGRUYXJnZXQsIHRhcmdldCkpOw0KKwkJaWYoc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpew0KKwkJCWlmICh0YXJnZXQuZ2V0VHlwZSgpICE9IG51bGwpIHsNCisJCQkJdXBkYXRlUG9ydFR5cGVzQW5kTmFtZXModGFyZ2V0LmdldFR5cGUoKSx0YXJnZXQuZ2V0U2luZ3VsYXJQb3J0TmFtZSgpKTsNCisJCQl9IGVsc2Ugew0KKwkJCQl1cGRhdGVQb3J0VHlwZXNBbmROYW1lcyhzb3VyY2UuZ2V0VHlwZSgpLHNvdXJjZS5nZXRTaW5ndWxhclBvcnROYW1lKCkpOw0KKwkJCX0NCisJCQl1cGRhdGVNYXBwaW5nTnVtYmVyKCk7DQorCQl9DQorCQllbHNlIHsNCisJCQl0aGlzLnVwZGF0ZUNSVmlzdWFsaXphdGlvbigpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX01BUFBJTkdfX1NPVVJDRToNCisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0U291cmNlKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX01BUFBJTkdfX1RBUkdFVDoNCisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRUYXJnZXQoKTsNCisJCQkJcmV0dXJuIGJhc2ljR2V0VGFyZ2V0KCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1BPUlRfTUFQUElOR19fU09VUkNFOg0KKwkJCQlzZXRTb3VyY2UoKFNpbmdsZVBvcnQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX01BUFBJTkdfX1RBUkdFVDoNCisJCQkJc2V0VGFyZ2V0KChTaW5nbGVJbnB1dFBvcnQpbmV3VmFsdWUpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUE9SVF9NQVBQSU5HX19TT1VSQ0U6DQorCQkJCXNldFNvdXJjZSgoU2luZ2xlUG9ydCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUE9SVF9NQVBQSU5HX19UQVJHRVQ6DQorCQkJCXNldFRhcmdldCgoU2luZ2xlSW5wdXRQb3J0KW51bGwpOw0KKwkJCQlyZXR1cm47DQorCQl9DQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1BPUlRfTUFQUElOR19fU09VUkNFOg0KKwkJCQlyZXR1cm4gc291cmNlICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9QT1JUX01BUFBJTkdfX1RBUkdFVDoNCisJCQkJcmV0dXJuIHRhcmdldCAhPSBudWxsOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorfSAvL1NpbmdsZVBvcnRNYXBwaW5nSW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1NpbmdsZVF1ZXVlZFVuaXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVRdWV1ZWRVbml0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODY4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9TaW5nbGVRdWV1ZWRVbml0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDUwIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLmltcGw7DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuQ29tcmVsUGFja2FnZTsNCitpbXBvcnQgY29tcmVsLkhlbHBlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5JbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlJlZmFjdG9yaW5nVW5pdDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQ7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIFF1ZXVlZCBVbml0PC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZVF1ZXVlZFVuaXRJbXBsI2dldEhlbHBlclVuaXRzIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVRdWV1ZWRVbml0SW1wbCNnZXRSZWZhY3RvcmluZ1VuaXQgPGVtPlJlZmFjdG9yaW5nIFVuaXQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVRdWV1ZWRVbml0SW1wbCNnZXRTaW5nbGVJbnB1dFBvcnRzIDxlbT5TaW5nbGUgSW5wdXQgUG9ydHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVRdWV1ZWRVbml0SW1wbCNnZXRNdWx0aUlucHV0UG9ydCA8ZW0+TXVsdGkgSW5wdXQgUG9ydDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIGNvbXJlbC5pbXBsLlNpbmdsZVF1ZXVlZFVuaXRJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBjb21yZWwuaW1wbC5TaW5nbGVRdWV1ZWRVbml0SW1wbCNnZXRMYmxTdHJpY3QgPGVtPkxibCBTdHJpY3Q8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTaW5nbGVRdWV1ZWRVbml0SW1wbCBleHRlbmRzIFF1ZXVlZFVuaXRJbXBsIGltcGxlbWVudHMgU2luZ2xlUXVldWVkVW5pdCB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWxwZXJVbml0cygpIDxlbT5IZWxwZXIgVW5pdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0SGVscGVyVW5pdHMoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgRUxpc3Q8SGVscGVyVW5pdD4gaGVscGVyVW5pdHM7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZhY3RvcmluZ1VuaXQoKSA8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0UmVmYWN0b3JpbmdVbml0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFJlZmFjdG9yaW5nVW5pdCByZWZhY3RvcmluZ1VuaXQ7DQorDQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaW5nbGVJbnB1dFBvcnRzKCkgPGVtPlNpbmdsZSBJbnB1dCBQb3J0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRTaW5nbGVJbnB1dFBvcnRzKCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIEVMaXN0PFNpbmdsZUlucHV0UG9ydD4gc2luZ2xlSW5wdXRQb3J0czsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpSW5wdXRQb3J0KCkgPGVtPk11bHRpIElucHV0IFBvcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldE11bHRpSW5wdXRQb3J0KCkNCisJICogQGdlbmVyYXRlZA0KKwkgKiBAb3JkZXJlZA0KKwkgKi8NCisJcHJvdGVjdGVkIE11bHRpSW5wdXRQb3J0IG11bHRpSW5wdXRQb3J0Ow0KKw0KKwkvKioNCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSAiU2luZ2xlIFF1ZXVlZCBVbml0IjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHNlZSAjZ2V0VHlwZSgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGJsU3RyaWN0KCkgPGVtPkxibCBTdHJpY3Q8L2VtPn0nIGF0dHJpYnV0ZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBzZWUgI2dldExibFN0cmljdCgpDQorCSAqIEBnZW5lcmF0ZWQNCisJICogQG9yZGVyZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExCTF9TVFJJQ1RfRURFRkFVTFQgPSAic3RyaWN0IjsNCisNCisJLyoqDQorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExibFN0cmljdCgpIDxlbT5MYmwgU3RyaWN0PC9lbT59JyBhdHRyaWJ1dGUuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAc2VlICNnZXRMYmxTdHJpY3QoKQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqIEBvcmRlcmVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgU3RyaW5nIGxibFN0cmljdCA9IExCTF9TVFJJQ1RfRURFRkFVTFQ7DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFNpbmdsZVF1ZXVlZFVuaXRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlNJTkdMRV9RVUVVRURfVU5JVDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxIZWxwZXJVbml0PiBnZXRIZWxwZXJVbml0cygpIHsNCisJCWlmIChoZWxwZXJVbml0cyA9PSBudWxsKSB7DQorCQkJaGVscGVyVW5pdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SGVscGVyVW5pdD4oSGVscGVyVW5pdC5jbGFzcywgdGhpcywgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUyk7DQorCQl9DQorCQlyZXR1cm4gaGVscGVyVW5pdHM7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgUmVmYWN0b3JpbmdVbml0IGdldFJlZmFjdG9yaW5nVW5pdCgpIHsNCisJCXJldHVybiByZWZhY3RvcmluZ1VuaXQ7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWZhY3RvcmluZ1VuaXQoUmVmYWN0b3JpbmdVbml0IG5ld1JlZmFjdG9yaW5nVW5pdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJUmVmYWN0b3JpbmdVbml0IG9sZFJlZmFjdG9yaW5nVW5pdCA9IHJlZmFjdG9yaW5nVW5pdDsNCisJCXJlZmFjdG9yaW5nVW5pdCA9IG5ld1JlZmFjdG9yaW5nVW5pdDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCwgb2xkUmVmYWN0b3JpbmdVbml0LCBuZXdSZWZhY3RvcmluZ1VuaXQpOw0KKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCisJCX0NCisJCXJldHVybiBtc2dzOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0UmVmYWN0b3JpbmdVbml0KFJlZmFjdG9yaW5nVW5pdCBuZXdSZWZhY3RvcmluZ1VuaXQpIHsNCisJCWlmIChuZXdSZWZhY3RvcmluZ1VuaXQgIT0gcmVmYWN0b3JpbmdVbml0KSB7DQorCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQorCQkJaWYgKHJlZmFjdG9yaW5nVW5pdCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVmYWN0b3JpbmdVbml0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdSZWZhY3RvcmluZ1VuaXQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlZmFjdG9yaW5nVW5pdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklULCBudWxsLCBtc2dzKTsNCisJCQltc2dzID0gYmFzaWNTZXRSZWZhY3RvcmluZ1VuaXQobmV3UmVmYWN0b3JpbmdVbml0LCBtc2dzKTsNCisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQorCQl9DQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fUkVGQUNUT1JJTkdfVU5JVCwgbmV3UmVmYWN0b3JpbmdVbml0LCBuZXdSZWZhY3RvcmluZ1VuaXQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBFTGlzdDxTaW5nbGVJbnB1dFBvcnQ+IGdldFNpbmdsZUlucHV0UG9ydHMoKSB7DQorCQlpZiAoc2luZ2xlSW5wdXRQb3J0cyA9PSBudWxsKSB7DQorCQkJc2luZ2xlSW5wdXRQb3J0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTaW5nbGVJbnB1dFBvcnQ+KFNpbmdsZUlucHV0UG9ydC5jbGFzcywgdGhpcywgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUyk7DQorCQl9DQorCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0czsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBNdWx0aUlucHV0UG9ydCBnZXRNdWx0aUlucHV0UG9ydCgpIHsNCisJCXJldHVybiBtdWx0aUlucHV0UG9ydDsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE11bHRpSW5wdXRQb3J0KE11bHRpSW5wdXRQb3J0IG5ld011bHRpSW5wdXRQb3J0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorCQlNdWx0aUlucHV0UG9ydCBvbGRNdWx0aUlucHV0UG9ydCA9IG11bHRpSW5wdXRQb3J0Ow0KKwkJbXVsdGlJbnB1dFBvcnQgPSBuZXdNdWx0aUlucHV0UG9ydDsNCisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgew0KKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVCwgb2xkTXVsdGlJbnB1dFBvcnQsIG5ld011bHRpSW5wdXRQb3J0KTsNCisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQorCQl9DQorCQlyZXR1cm4gbXNnczsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyB2b2lkIHNldE11bHRpSW5wdXRQb3J0KE11bHRpSW5wdXRQb3J0IG5ld011bHRpSW5wdXRQb3J0KSB7DQorCQlpZiAobmV3TXVsdGlJbnB1dFBvcnQgIT0gbXVsdGlJbnB1dFBvcnQpIHsNCisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCisJCQlpZiAobXVsdGlJbnB1dFBvcnQgIT0gbnVsbCkNCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW11bHRpSW5wdXRQb3J0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlQsIG51bGwsIG1zZ3MpOw0KKwkJCWlmIChuZXdNdWx0aUlucHV0UG9ydCAhPSBudWxsKQ0KKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TXVsdGlJbnB1dFBvcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVCwgbnVsbCwgbXNncyk7DQorCQkJbXNncyA9IGJhc2ljU2V0TXVsdGlJbnB1dFBvcnQobmV3TXVsdGlJbnB1dFBvcnQsIG1zZ3MpOw0KKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsNCisJCX0NCisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JULCBuZXdNdWx0aUlucHV0UG9ydCwgbmV3TXVsdGlJbnB1dFBvcnQpKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCisJCXJldHVybiB0eXBlOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFN0cmluZyBnZXRMYmxTdHJpY3QoKSB7DQorCQlyZXR1cm4gbGJsU3RyaWN0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIHZvaWQgc2V0TGJsU3RyaWN0KFN0cmluZyBuZXdMYmxTdHJpY3QpIHsNCisJCVN0cmluZyBvbGRMYmxTdHJpY3QgPSBsYmxTdHJpY3Q7DQorCQlsYmxTdHJpY3QgPSBuZXdMYmxTdHJpY3Q7DQorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1QsIG9sZExibFN0cmljdCwgbGJsU3RyaWN0KSk7DQorCX0NCisJDQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgdm9pZCBzZXRTdHJpY3QoYm9vbGVhbiBuZXdTdHJpY3QpIHsNCisJCXN1cGVyLnNldFN0cmljdChuZXdTdHJpY3QpOw0KKwkJaWYgKG5ld1N0cmljdCkgc2V0TGJsU3RyaWN0KCJzdHJpY3QiKTsNCisJCWVsc2Ugc2V0TGJsU3RyaWN0KCJub24gc3RyaWN0Iik7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGVscGVyVW5pdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJCXJldHVybiBiYXNpY1NldFJlZmFjdG9yaW5nVW5pdChudWxsLCBtc2dzKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2luZ2xlSW5wdXRQb3J0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGJhc2ljU2V0TXVsdGlJbnB1dFBvcnQobnVsbCwgbXNncyk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19IRUxQRVJfVU5JVFM6DQorCQkJCXJldHVybiBnZXRIZWxwZXJVbml0cygpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX1JFRkFDVE9SSU5HX1VOSVQ6DQorCQkJCXJldHVybiBnZXRSZWZhY3RvcmluZ1VuaXQoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCXJldHVybiBnZXRTaW5nbGVJbnB1dFBvcnRzKCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fTVVMVElfSU5QVVRfUE9SVDoNCisJCQkJcmV0dXJuIGdldE11bHRpSW5wdXRQb3J0KCk7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fVFlQRToNCisJCQkJcmV0dXJuIGdldFR5cGUoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19MQkxfU1RSSUNUOg0KKwkJCQlyZXR1cm4gZ2V0TGJsU3RyaWN0KCk7DQorCQl9DQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCQlnZXRIZWxwZXJVbml0cygpLmNsZWFyKCk7DQorCQkJCWdldEhlbHBlclVuaXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBIZWxwZXJVbml0PiluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUOg0KKwkJCQlzZXRSZWZhY3RvcmluZ1VuaXQoKFJlZmFjdG9yaW5nVW5pdCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19TSU5HTEVfSU5QVVRfUE9SVFM6DQorCQkJCWdldFNpbmdsZUlucHV0UG9ydHMoKS5jbGVhcigpOw0KKwkJCQlnZXRTaW5nbGVJbnB1dFBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTaW5nbGVJbnB1dFBvcnQ+KW5ld1ZhbHVlKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX01VTFRJX0lOUFVUX1BPUlQ6DQorCQkJCXNldE11bHRpSW5wdXRQb3J0KChNdWx0aUlucHV0UG9ydCluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19MQkxfU1RSSUNUOg0KKwkJCQlzZXRMYmxTdHJpY3QoKFN0cmluZyluZXdWYWx1ZSk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorCX0NCisNCisJLyoqDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fSEVMUEVSX1VOSVRTOg0KKwkJCQlnZXRIZWxwZXJVbml0cygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUOg0KKwkJCQlzZXRSZWZhY3RvcmluZ1VuaXQoKFJlZmFjdG9yaW5nVW5pdCludWxsKTsNCisJCQkJcmV0dXJuOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX1NJTkdMRV9JTlBVVF9QT1JUUzoNCisJCQkJZ2V0U2luZ2xlSW5wdXRQb3J0cygpLmNsZWFyKCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUOg0KKwkJCQlzZXRNdWx0aUlucHV0UG9ydCgoTXVsdGlJbnB1dFBvcnQpbnVsbCk7DQorCQkJCXJldHVybjsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19MQkxfU1RSSUNUOg0KKwkJCQlzZXRMYmxTdHJpY3QoTEJMX1NUUklDVF9FREVGQVVMVCk7DQorCQkJCXJldHVybjsNCisJCX0NCisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX0hFTFBFUl9VTklUUzoNCisJCQkJcmV0dXJuIGhlbHBlclVuaXRzICE9IG51bGwgJiYgIWhlbHBlclVuaXRzLmlzRW1wdHkoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19SRUZBQ1RPUklOR19VTklUOg0KKwkJCQlyZXR1cm4gcmVmYWN0b3JpbmdVbml0ICE9IG51bGw7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlNJTkdMRV9RVUVVRURfVU5JVF9fU0lOR0xFX0lOUFVUX1BPUlRTOg0KKwkJCQlyZXR1cm4gc2luZ2xlSW5wdXRQb3J0cyAhPSBudWxsICYmICFzaW5nbGVJbnB1dFBvcnRzLmlzRW1wdHkoKTsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19NVUxUSV9JTlBVVF9QT1JUOg0KKwkJCQlyZXR1cm4gbXVsdGlJbnB1dFBvcnQgIT0gbnVsbDsNCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1FVRVVFRF9VTklUX19UWVBFOg0KKwkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOw0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVRfX0xCTF9TVFJJQ1Q6DQorCQkJCXJldHVybiBMQkxfU1RSSUNUX0VERUZBVUxUID09IG51bGwgPyBsYmxTdHJpY3QgIT0gbnVsbCA6ICFMQkxfU1RSSUNUX0VERUZBVUxULmVxdWFscyhsYmxTdHJpY3QpOw0KKwkJfQ0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKwl9DQorDQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisJCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7DQorCQlyZXN1bHQuYXBwZW5kKHR5cGUpOw0KKwkJcmVzdWx0LmFwcGVuZCgiLCBsYmxTdHJpY3Q6ICIpOw0KKwkJcmVzdWx0LmFwcGVuZChsYmxTdHJpY3QpOw0KKwkJcmVzdWx0LmFwcGVuZCgnKScpOw0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KKwl9DQorCQ0KKwlwdWJsaWMgRUxpc3Q8SW5wdXRQb3J0PiBnZXRBbGxJbnB1dFBvcnRzKCkgew0KKwkJRUxpc3Q8SW5wdXRQb3J0PiBpbnB1dFBvcnRzID0gbmV3IEJhc2ljRUxpc3Q8SW5wdXRQb3J0PigpOw0KKwkJaW5wdXRQb3J0cy5hZGRBbGwodGhpcy5nZXRTaW5nbGVJbnB1dFBvcnRzKCkpOw0KKwkJaW5wdXRQb3J0cy5hZGQodGhpcy5nZXRNdWx0aUlucHV0UG9ydCgpKTsNCisJCXJldHVybiBpbnB1dFBvcnRzOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBpbml0KCkgew0KKwkJTXVsdGlJbnB1dFBvcnQgcG9ydCA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorCQl0aGlzLm11bHRpSW5wdXRQb3J0ID0gcG9ydDsNCisJfQ0KKw0KK30gLy9TaW5nbGVRdWV1ZWRVbml0SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC9pbXBsL1R3aWNlZFF1ZXVlZFVuaXRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Ud2ljZWRRdWV1ZWRVbml0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTgzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvaW1wbC9Ud2ljZWRRdWV1ZWRVbml0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQkDQorICovDQorcGFja2FnZSBjb21yZWwuaW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCisNCitpbXBvcnQgY29tcmVsLkNvbXJlbFBhY2thZ2U7DQoraW1wb3J0IGNvbXJlbC5Ud2ljZWRRdWV1ZWRVbml0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR3aWNlZCBRdWV1ZWQgVW5pdDwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUd2ljZWRRdWV1ZWRVbml0SW1wbCBleHRlbmRzIFF1ZXVlZFVuaXRJbXBsIGltcGxlbWVudHMgVHdpY2VkUXVldWVkVW5pdCB7DQorCS8qKg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFR3aWNlZFF1ZXVlZFVuaXRJbXBsKCkgew0KKwkJc3VwZXIoKTsNCisJfQ0KKw0KKwkvKioNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCUBPdmVycmlkZQ0KKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisJCXJldHVybiBDb21yZWxQYWNrYWdlLkxpdGVyYWxzLlRXSUNFRF9RVUVVRURfVU5JVDsNCisJfQ0KKw0KK30gLy9Ud2ljZWRRdWV1ZWRVbml0SW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC91dGlsL0NvbG9ycy5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL3V0aWwvQ29sb3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkMjQwMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC91dGlsL0NvbG9ycy5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACitwYWNrYWdlIGNvbXJlbC51dGlsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7DQoraW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0UGFuZTsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5EZWZhdWx0U3R5bGVkRG9jdW1lbnQ7DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU2ltcGxlQXR0cmlidXRlU2V0Ow0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LlN0eWxlQ29uc3RhbnRzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7DQorDQorcHVibGljIGNsYXNzIENvbG9ycyB7DQorDQorCS8qKg0KKwkgKiBMaWVmZXJ0IGRlciBkcmVpIEdydW5kZmFyYmVuICJSZWQiLCAiR3JlZW4iIHVuZCAiQmx1ZSINCisJICogDQorCSAqIEByZXR1cm4gTGlzdGUgZGVyIEdydW5kZmFyYmVuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxDb2xvcj4gZ3JvdW5kQ29sb3JzKCkgew0KKwkJQXJyYXlMaXN0PENvbG9yPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENvbG9yPigpOw0KKwkJcmVzdWx0LmFkZChuZXcgQ29sb3IobnVsbCwgMjU1LCAwLCAwKSk7DQorCQlyZXN1bHQuYWRkKG5ldyBDb2xvcihudWxsLCAwLCAyNTUsIDApKTsNCisJCXJlc3VsdC5hZGQobmV3IENvbG9yKG51bGwsIDAsIDAsIDI1NSkpOw0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogTGllZmVydCBkaWUgTWlzY2hmYXJiZW4gZGVyIGRyZWkgR3J1bmRmYXJiZW4gIk1hZ2VudGEiLCAiWWVsbG93IiB1bmQNCisJICogIkN5ZW4iDQorCSAqIA0KKwkgKiBAcmV0dXJuIExpc3RlIGFsbGVyIE1pc2NoZmFyYmVuIGF1cyBkZW4gZHJlaSBHcnVuZGZhcmJlbg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8Q29sb3I+IGdyb3VuZENvbG9yczIoKSB7DQorCQlBcnJheUxpc3Q8Q29sb3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q29sb3I+KCk7DQorCQlyZXN1bHQuYWRkKG5ldyBDb2xvcihudWxsLCAyNTUsIDI1NSwgMCkpOw0KKwkJcmVzdWx0LmFkZChuZXcgQ29sb3IobnVsbCwgMCwgMjU1LCAyNTUpKTsNCisJCXJlc3VsdC5hZGQobmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMjU1KSk7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBMaWVmZXJ0IHp1IGVpbmVtIEluZGV4IGVpbmUgaGllciBiZXJlY2huZXRlIEZhcmJlIEFscyBHcnVuZGxhZ2Ugd2lyZCBkZXINCisJICogRmFyYmtyZWlzIGdlbm9tbWVuLCBpbmRlbSBkaWUgRmFyYmVuIHp3aXNjaGVuIGRlbiBGYXJiZW4gYXVzIGRlbg0KKwkgKiBlaW56ZWxuZW4gTWlzY2h1bmdlbiBlcnN0ZWxsdCB3ZXJkZW4uIEplZG9jaCBsaWVmZXJ0IGRpZSBNZXRob2RlIGFsbGUNCisJICogRmFyYmVuIGFscyBMaXN0ZSwgYW5nZWZhbmdlbiBtaXQgZGVuIGRyZWkgR3J1bmRmYXJiZW4sIGdlZm9sZ3Qgdm9uIGRlbg0KKwkgKiBkcmVpIE1pc2NoZmFyYmVuLCBnZWZvbGd0IHZvbiBkZW4gTWlzY2hmYXJiZW4gZGllc2VyIEZhcmJlbiBldGMuDQorCSAqIA0KKwkgKiBAcGFyYW0gaSBJbmRleA0KKwkgKiBAcmV0dXJuIEZhcmJrcmVpcyBhbHMgc2VsYnN0ZGVmaW5pZXJ0ZSBMaXN0ZQ0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8Q29sb3I+IGdldENvbG9ycyhpbnQgaSkgew0KKwkJQXJyYXlMaXN0PENvbG9yPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENvbG9yPigpOw0KKwkJLyoqIG1lcmdlTGlzdCBlbnRzcHJpY2h0IGRlbSBGYXJia3JlaXMqLw0KKwkJQXJyYXlMaXN0PENvbG9yPiBtZXJnZUxpc3QgPSBtZXJnZUxpc3RzKGdyb3VuZENvbG9ycygpLCBncm91bmRDb2xvcnMyKCkpOw0KKwkJcmVzdWx0LmFkZEFsbChncm91bmRDb2xvcnMoKSk7DQorCQlyZXN1bHQuYWRkQWxsKGdyb3VuZENvbG9yczIoKSk7DQorCQlpbnQgayA9IDI7DQorCQlBcnJheUxpc3Q8Q29sb3I+IG5ld0NvbG9yczsNCisJCUNvbG9yIG5ld0NvbG9yOw0KKwkJaW50IHI7DQorCQlpbnQgZzsNCisJCWludCBiOw0KKwkJQ29sb3Igb25lOw0KKwkJQ29sb3IgdHdvOw0KKwkJDQorCQkvKiogSW4gZGVyIGZvbGdlbmRlbiBTY2hsZWlmZSB3ZXJkZW4gZGllIEZhcmJlbiBkZXMgRmFyYmtyZWlzZXMgZ2VtaXNjaHQgKi8NCisJCXdoaWxlIChrIDwgaSkgeyAvLyBTY2hsZWlmZSBlbmRldCwgd2VubiBnZW51ZyBGYXJiZW4gZ2VtaXNjaCB3b3JkZW4gc2luZA0KKwkJCW5ld0NvbG9ycyA9IG5ldyBBcnJheUxpc3Q8Q29sb3I+KCk7DQorCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtZXJnZUxpc3Quc2l6ZSgpOyBqKyspIHsNCisJCQkJb25lID0gbWVyZ2VMaXN0LmdldChqKTsNCisJCQkJaWYgKGogKyAxIDwgbWVyZ2VMaXN0LnNpemUoKSkgew0KKwkJCQkJdHdvID0gbWVyZ2VMaXN0LmdldCgoaiArIDEpKTsNCisJCQkJfSBlbHNlIHsNCisJCQkJCXR3byA9IG1lcmdlTGlzdC5nZXQoMCk7DQorCQkJCX0NCisJCQkJciA9IChvbmUuZ2V0UmVkKCkgKyB0d28uZ2V0UmVkKCkpIC8gMjsNCisJCQkJYiA9IChvbmUuZ2V0Qmx1ZSgpICsgdHdvLmdldEJsdWUoKSkgLyAyOw0KKwkJCQlnID0gKG9uZS5nZXRHcmVlbigpICsgdHdvLmdldEdyZWVuKCkpIC8gMjsNCisJCQkJbmV3Q29sb3IgPSBuZXcgQ29sb3IobnVsbCwgciwgZywgYik7DQorCQkJCW5ld0NvbG9ycy5hZGQobmV3Q29sb3IpOw0KKwkJCQlrKys7DQorCQkJCWlmIChrID49IGkpIHsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorDQorCQkJfQ0KKwkJCW1lcmdlTGlzdCA9IG1lcmdlTGlzdHMobWVyZ2VMaXN0LCBuZXdDb2xvcnMpOw0KKwkJCXJlc3VsdC5hZGRBbGwobmV3Q29sb3JzKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIE1lcmdlZCB6d2VpIExpc3RlbiBnbGVpY2hlciBM5G5nZQ0KKwkgKiBAcGFyYW0gb2xkDQorCSAqIEBwYXJhbSBuZXdDb2xvcnMNCisJICogQHJldHVybg0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PENvbG9yPiBtZXJnZUxpc3RzKEFycmF5TGlzdDxDb2xvcj4gb2xkLA0KKwkJCUFycmF5TGlzdDxDb2xvcj4gbmV3Q29sb3JzKSB7DQorCQlBcnJheUxpc3Q8Q29sb3I+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q29sb3I+KCk7DQorCQlyZXN1bHQuYWRkQWxsKG9sZCk7DQorCQlpbnQgaSA9IDE7DQorCQlmb3IgKENvbG9yIGNvbG9yIDogbmV3Q29sb3JzKSB7DQorCQkJaWYgKGkgPCByZXN1bHQuc2l6ZSgpKSB7DQorCQkJCXJlc3VsdC5hZGQoaSwgY29sb3IpOw0KKwkJCQlpICs9IDI7DQorCQkJfSBlbHNlIHsNCisJCQkJcmVzdWx0LmFkZChjb2xvcik7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisNCisJfQ0KKw0KKwkNCisJLyoqDQorCSAqIE1haW5tZXRob2RlIHp1bSBUZXN0ZW4NCisJICogQHBhcmFtIGFyZ3MNCisJICovDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB7DQorDQorCQlKRnJhbWUgZnJhbWUgPSBuZXcgSkZyYW1lKCk7DQorDQorCQlBdHRyaWJ1dGVkVGV4dFBhbmUgcGFuZSA9IG5ldyBBdHRyaWJ1dGVkVGV4dFBhbmUoKTsNCisNCisJCWZyYW1lLmFkZChwYW5lKTsNCisJCWZyYW1lLnNldEJvdW5kcygxMDAsIDEwMCwgNjAwLCA0MDApOw0KKwkJZnJhbWUuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsNCisJCWZyYW1lLnNldFZpc2libGUodHJ1ZSk7DQorCQlpbnQgaSA9IDE7DQorCQlmb3IgKENvbG9yIGNvbG9yIDogZ2V0Q29sb3JzKDIwMCkpIHsNCisJCQlTdHJpbmcgcyA9ICIgICAgICAgICI7DQorCQkJaWYgKGkrKyAlIDEwID09IDApIHsNCisJCQkJcyArPSAiXG4iOw0KKwkJCX0NCisJCQlwYW5lLmFwcGVuZChzLCBjb2xvcik7DQorCQl9DQorDQorCX0NCisNCisJLyoqIHN1YmNsYXNzIG9mIEpUZXh0UGFuZSBhbGxvd2luZyBjb2xvciBhdHRyaWJ1dGVzICovDQorCXN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVkVGV4dFBhbmUgZXh0ZW5kcyBKVGV4dFBhbmUgew0KKwkJLyoqDQorCQkgKiANCisJCSAqLw0KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTcyNTQyNTQyNTEzMzAyNDI0NEw7DQorCQlwcml2YXRlIERlZmF1bHRTdHlsZWREb2N1bWVudCBtX2RlZmF1bHRTdHlsZWREb2N1bWVudCA9IG5ldyBEZWZhdWx0U3R5bGVkRG9jdW1lbnQoKTsNCisNCisJCS8qKiBjb25zdHJ1Y3RvciAqLw0KKwkJcHVibGljIEF0dHJpYnV0ZWRUZXh0UGFuZSgpIHsNCisJCQl0aGlzLnNldERvY3VtZW50KG1fZGVmYXVsdFN0eWxlZERvY3VtZW50KTsNCisJCX0NCisNCisJCS8qKiBhcHBlbmQgdGV4dCAqLw0KKwkJcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBzdHJpbmcsIENvbG9yIGNvbG9yKSB7DQorCQkJdHJ5IHsNCisJCQkJU2ltcGxlQXR0cmlidXRlU2V0IGF0dHIgPSBuZXcgU2ltcGxlQXR0cmlidXRlU2V0KCk7DQorCQkJCVN0eWxlQ29uc3RhbnRzLnNldEJhY2tncm91bmQoYXR0ciwNCisJCQkJCQluZXcgamF2YS5hd3QuQ29sb3IoY29sb3IuZ2V0UmVkKCksIGNvbG9yLmdldEdyZWVuKCksDQorCQkJCQkJCQljb2xvci5nZXRCbHVlKCkpKTsNCisJCQkJU3R5bGVDb25zdGFudHMuc2V0Rm9udFNpemUoYXR0ciwgMjApOw0KKwkJCQltX2RlZmF1bHRTdHlsZWREb2N1bWVudC5pbnNlcnRTdHJpbmcoDQorCQkJCQkJbV9kZWZhdWx0U3R5bGVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIHN0cmluZywgYXR0cik7DQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCQl9DQorCQl9DQorDQorCQkvKiogYXBwZW5kIHRleHQgaW4gZGVmYXVsdCBjb2xvciAqLw0KKwkJcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBzdHJpbmcpIHsNCisJCQlhcHBlbmQoc3RyaW5nLCBuZXcgQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSkpOw0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC91dGlsL0NvbXJlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvdXRpbC9Db21yZWxBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Yzk5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvdXRpbC9Db21yZWxBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODYyIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnV0aWw7DQorDQoraW1wb3J0IGNvbXJlbC4qOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIGNvbXJlbC5Db21yZWxQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb21yZWxBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgc3RhdGljIENvbXJlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOw0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIENvbXJlbEFkYXB0ZXJGYWN0b3J5KCkgew0KKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorCQkJbW9kZWxQYWNrYWdlID0gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0U7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJQE92ZXJyaWRlDQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgew0KKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7DQorCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOw0KKwkJfQ0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCS8qKg0KKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgQ29tcmVsU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCisJCW5ldyBDb21yZWxTd2l0Y2g8QWRhcHRlcj4oKSB7DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbXBvc2l0ZVJlZmFjdG9yaW5nKENvbXBvc2l0ZVJlZmFjdG9yaW5nIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlUmVmYWN0b3JpbmdBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlTmFtZWRFbGVtZW50QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVzY3JpYmVkRWxlbWVudChEZXNjcmliZWRFbGVtZW50IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpYmVkRWxlbWVudEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlZmFjdG9yaW5nVW5pdChSZWZhY3RvcmluZ1VuaXQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVSZWZhY3RvcmluZ1VuaXRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNb2RlbFJlZmFjdG9yaW5nKE1vZGVsUmVmYWN0b3Jpbmcgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVNb2RlbFJlZmFjdG9yaW5nQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXRvbWljVW5pdChBdG9taWNVbml0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlQXRvbWljVW5pdEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbXBvc2l0ZVVuaXQoQ29tcG9zaXRlVW5pdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZVVuaXRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZXF1ZW50aWFsVW5pdChTZXF1ZW50aWFsVW5pdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbnRpYWxVbml0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29uZGl0aW9uQ2hlY2soQ29uZGl0aW9uQ2hlY2sgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVDb25kaXRpb25DaGVja0FkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbmRpdGlvbmFsVW5pdChDb25kaXRpb25hbFVuaXQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVDb25kaXRpb25hbFVuaXRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VRdWV1ZWRVbml0KFF1ZXVlZFVuaXQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVRdWV1ZWRVbml0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2luZ2xlUXVldWVkVW5pdChTaW5nbGVRdWV1ZWRVbml0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU2luZ2xlUXVldWVkVW5pdEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVR3aWNlZFF1ZXVlZFVuaXQoVHdpY2VkUXVldWVkVW5pdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVR3aWNlZFF1ZXVlZFVuaXRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDYXJ0ZXNpYW5RdWV1ZWRVbml0KENhcnRlc2lhblF1ZXVlZFVuaXQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGFyYWxsZWxRdWV1ZWRVbml0KFBhcmFsbGVsUXVldWVkVW5pdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVBhcmFsbGVsUXVldWVkVW5pdEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUhlbHBlclVuaXQoSGVscGVyVW5pdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUhlbHBlclVuaXRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VGZWF0dXJlVW5pdChGZWF0dXJlVW5pdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUZlYXR1cmVVbml0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2luZ2xlRmVhdHVyZVVuaXQoU2luZ2xlRmVhdHVyZVVuaXQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVTaW5nbGVGZWF0dXJlVW5pdEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU11bHRpRmVhdHVyZVVuaXQoTXVsdGlGZWF0dXJlVW5pdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZU11bHRpRmVhdHVyZVVuaXRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VGaWx0ZXJVbml0KEZpbHRlclVuaXQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVGaWx0ZXJVbml0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2luZ2xlRmlsdGVyVW5pdChTaW5nbGVGaWx0ZXJVbml0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU2luZ2xlRmlsdGVyVW5pdEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU11bHRpRmlsdGVyVW5pdChNdWx0aUZpbHRlclVuaXQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVNdWx0aUZpbHRlclVuaXRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VIZWxwZXIoSGVscGVyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlSGVscGVyQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRmVhdHVyZUhlbHBlcihGZWF0dXJlSGVscGVyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlRmVhdHVyZUhlbHBlckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNpbmdsZUZlYXR1cmVIZWxwZXIoU2luZ2xlRmVhdHVyZUhlbHBlciBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZUZlYXR1cmVIZWxwZXJBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aUZlYXR1cmVIZWxwZXIoTXVsdGlGZWF0dXJlSGVscGVyIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlGZWF0dXJlSGVscGVyQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRmlsdGVySGVscGVyKEZpbHRlckhlbHBlciBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUZpbHRlckhlbHBlckFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNpbmdsZUZpbHRlckhlbHBlcihTaW5nbGVGaWx0ZXJIZWxwZXIgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVTaW5nbGVGaWx0ZXJIZWxwZXJBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aUZpbHRlckhlbHBlcihNdWx0aUZpbHRlckhlbHBlciBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZU11bHRpRmlsdGVySGVscGVyQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9ydChQb3J0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlUG9ydEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNpbmdsZVBvcnQoU2luZ2xlUG9ydCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZVBvcnRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aVBvcnQoTXVsdGlQb3J0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlQb3J0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW5wdXRQb3J0KElucHV0UG9ydCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUlucHV0UG9ydEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU91dHB1dFBvcnQoT3V0cHV0UG9ydCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZU91dHB1dFBvcnRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTaW5nbGVJbnB1dFBvcnQoU2luZ2xlSW5wdXRQb3J0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU2luZ2xlSW5wdXRQb3J0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTXVsdGlJbnB1dFBvcnQoTXVsdGlJbnB1dFBvcnQgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVNdWx0aUlucHV0UG9ydEFkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNpbmdsZU91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZU91dHB1dFBvcnRBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aU91dHB1dFBvcnQoTXVsdGlPdXRwdXRQb3J0IG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlPdXRwdXRQb3J0QWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9ydE1hcHBpbmcoUG9ydE1hcHBpbmcgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVQb3J0TWFwcGluZ0FkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNpbmdsZVBvcnRNYXBwaW5nKFNpbmdsZVBvcnRNYXBwaW5nIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlU2luZ2xlUG9ydE1hcHBpbmdBZGFwdGVyKCk7DQorCQkJfQ0KKwkJCUBPdmVycmlkZQ0KKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNdWx0aVBvcnRNYXBwaW5nKE11bHRpUG9ydE1hcHBpbmcgb2JqZWN0KSB7DQorCQkJCXJldHVybiBjcmVhdGVNdWx0aVBvcnRNYXBwaW5nQWRhcHRlcigpOw0KKwkJCX0NCisJCQlAT3ZlcnJpZGUNCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTXVsdGlTaW5nbGVQb3J0TWFwcGluZyhNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIG9iamVjdCkgew0KKwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTaW5nbGVQb3J0TWFwcGluZ0FkYXB0ZXIoKTsNCisJCQl9DQorCQkJQE92ZXJyaWRlDQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7DQorCQkJfQ0KKwkJfTsNCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuDQorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlAT3ZlcnJpZGUNCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsNCisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOw0KKwl9DQorDQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZyA8ZW0+Q29tcG9zaXRlIFJlZmFjdG9yaW5nPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5Db21wb3NpdGVSZWZhY3RvcmluZw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSZWZhY3RvcmluZ0FkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5OYW1lZEVsZW1lbnQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZWRFbGVtZW50QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5EZXNjcmliZWRFbGVtZW50IDxlbT5EZXNjcmliZWQgRWxlbWVudDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuRGVzY3JpYmVkRWxlbWVudA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmliZWRFbGVtZW50QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5SZWZhY3RvcmluZ1VuaXQgPGVtPlJlZmFjdG9yaW5nIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlJlZmFjdG9yaW5nVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWZhY3RvcmluZ1VuaXRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLk1vZGVsUmVmYWN0b3JpbmcgPGVtPk1vZGVsIFJlZmFjdG9yaW5nPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGVsUmVmYWN0b3JpbmdBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLkF0b21pY1VuaXQgPGVtPkF0b21pYyBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5BdG9taWNVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF0b21pY1VuaXRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLkNvbXBvc2l0ZVVuaXQgPGVtPkNvbXBvc2l0ZSBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5Db21wb3NpdGVVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVVuaXRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLlNlcXVlbnRpYWxVbml0IDxlbT5TZXF1ZW50aWFsIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlNlcXVlbnRpYWxVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcXVlbnRpYWxVbml0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5Db25kaXRpb25DaGVjayA8ZW0+Q29uZGl0aW9uIENoZWNrPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5Db25kaXRpb25DaGVjaw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25kaXRpb25DaGVja0FkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuQ29uZGl0aW9uYWxVbml0IDxlbT5Db25kaXRpb25hbCBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5Db25kaXRpb25hbFVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uZGl0aW9uYWxVbml0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5RdWV1ZWRVbml0IDxlbT5RdWV1ZWQgVW5pdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuUXVldWVkVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVRdWV1ZWRVbml0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5TaW5nbGVRdWV1ZWRVbml0IDxlbT5TaW5nbGUgUXVldWVkIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZVF1ZXVlZFVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2luZ2xlUXVldWVkVW5pdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuVHdpY2VkUXVldWVkVW5pdCA8ZW0+VHdpY2VkIFF1ZXVlZCBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5Ud2ljZWRRdWV1ZWRVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR3aWNlZFF1ZXVlZFVuaXRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLkNhcnRlc2lhblF1ZXVlZFVuaXQgPGVtPkNhcnRlc2lhbiBRdWV1ZWQgVW5pdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuQ2FydGVzaWFuUXVldWVkVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXJ0ZXNpYW5RdWV1ZWRVbml0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQgPGVtPlBhcmFsbGVsIFF1ZXVlZCBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5QYXJhbGxlbFF1ZXVlZFVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyYWxsZWxRdWV1ZWRVbml0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5IZWxwZXJVbml0IDxlbT5IZWxwZXIgVW5pdDwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuSGVscGVyVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVIZWxwZXJVbml0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5GZWF0dXJlVW5pdCA8ZW0+RmVhdHVyZSBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5GZWF0dXJlVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVGZWF0dXJlVW5pdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlRmVhdHVyZVVuaXQgPGVtPlNpbmdsZSBGZWF0dXJlIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZUZlYXR1cmVVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZUZlYXR1cmVVbml0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5NdWx0aUZlYXR1cmVVbml0IDxlbT5NdWx0aSBGZWF0dXJlIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpRmVhdHVyZVVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTXVsdGlGZWF0dXJlVW5pdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuRmlsdGVyVW5pdCA8ZW0+RmlsdGVyIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLkZpbHRlclVuaXQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVyVW5pdEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlRmlsdGVyVW5pdCA8ZW0+U2luZ2xlIEZpbHRlciBVbml0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVGaWx0ZXJVbml0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZUZpbHRlclVuaXRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLk11bHRpRmlsdGVyVW5pdCA8ZW0+TXVsdGkgRmlsdGVyIFVuaXQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpRmlsdGVyVW5pdA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aUZpbHRlclVuaXRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLkhlbHBlciA8ZW0+SGVscGVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5IZWxwZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSGVscGVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5GZWF0dXJlSGVscGVyIDxlbT5GZWF0dXJlIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuRmVhdHVyZUhlbHBlcg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVGZWF0dXJlSGVscGVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5TaW5nbGVGZWF0dXJlSGVscGVyIDxlbT5TaW5nbGUgRmVhdHVyZSBIZWxwZXI8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZUZlYXR1cmVIZWxwZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2luZ2xlRmVhdHVyZUhlbHBlckFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyIDxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuTXVsdGlGZWF0dXJlSGVscGVyDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpRmVhdHVyZUhlbHBlckFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuRmlsdGVySGVscGVyIDxlbT5GaWx0ZXIgSGVscGVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5GaWx0ZXJIZWxwZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVySGVscGVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXIgPGVtPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVGaWx0ZXJIZWxwZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2luZ2xlRmlsdGVySGVscGVyQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5NdWx0aUZpbHRlckhlbHBlciA8ZW0+TXVsdGkgRmlsdGVyIEhlbHBlcjwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuTXVsdGlGaWx0ZXJIZWxwZXINCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTXVsdGlGaWx0ZXJIZWxwZXJBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLlBvcnQgPGVtPlBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlBvcnQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlUG9ydCA8ZW0+U2luZ2xlIFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZVBvcnQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2luZ2xlUG9ydEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuTXVsdGlQb3J0IDxlbT5NdWx0aSBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVBvcnQNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTXVsdGlQb3J0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5JbnB1dFBvcnQgPGVtPklucHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLklucHV0UG9ydA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnB1dFBvcnRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLk91dHB1dFBvcnQgPGVtPk91dHB1dCBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5PdXRwdXRQb3J0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dHB1dFBvcnRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLlNpbmdsZUlucHV0UG9ydCA8ZW0+U2luZ2xlIElucHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlNpbmdsZUlucHV0UG9ydA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVTaW5nbGVJbnB1dFBvcnRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLk11bHRpSW5wdXRQb3J0IDxlbT5NdWx0aSBJbnB1dCBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aUlucHV0UG9ydA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aUlucHV0UG9ydEFkYXB0ZXIoKSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBjb21yZWwuU2luZ2xlT3V0cHV0UG9ydCA8ZW0+U2luZ2xlIE91dHB1dCBQb3J0PC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5TaW5nbGVPdXRwdXRQb3J0DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbmdsZU91dHB1dFBvcnRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLk11bHRpT3V0cHV0UG9ydCA8ZW0+TXVsdGkgT3V0cHV0IFBvcnQ8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLk11bHRpT3V0cHV0UG9ydA0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aU91dHB1dFBvcnRBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLlBvcnRNYXBwaW5nIDxlbT5Qb3J0IE1hcHBpbmc8L2VtPn0nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQorCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQorCSAqIEBzZWUgY29tcmVsLlBvcnRNYXBwaW5nDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRNYXBwaW5nQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5TaW5nbGVQb3J0TWFwcGluZyA8ZW0+U2luZ2xlIFBvcnQgTWFwcGluZzwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuU2luZ2xlUG9ydE1hcHBpbmcNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2luZ2xlUG9ydE1hcHBpbmdBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgY29tcmVsLk11bHRpUG9ydE1hcHBpbmcgPGVtPk11bHRpIFBvcnQgTWFwcGluZzwvZW0+fScuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisJICogQHNlZSBjb21yZWwuTXVsdGlQb3J0TWFwcGluZw0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVNdWx0aVBvcnRNYXBwaW5nQWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nIDxlbT5NdWx0aSBTaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT59Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAc2VlIGNvbXJlbC5NdWx0aVNpbmdsZVBvcnRNYXBwaW5nDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU11bHRpU2luZ2xlUG9ydE1hcHBpbmdBZGFwdGVyKCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfSAvL0NvbXJlbEFkYXB0ZXJGYWN0b3J5DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL3V0aWwvQ29tcmVsU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvdXRpbC9Db21yZWxTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FkNDdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL3V0aWwvQ29tcmVsU3dpdGNoLmphdmEKQEAgLTAsMCArMSwxMTE1IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkJA0KKyAqLw0KK3BhY2thZ2UgY29tcmVsLnV0aWw7DQorDQoraW1wb3J0IGNvbXJlbC4qOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5Lg0KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0NCisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsDQorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QNCisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsDQorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgY29tcmVsLkNvbXJlbFBhY2thZ2UNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIENvbXJlbFN3aXRjaDxUPiB7DQorCS8qKg0KKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UNCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXByb3RlY3RlZCBzdGF0aWMgQ29tcmVsUGFja2FnZSBtb2RlbFBhY2thZ2U7DQorDQorCS8qKg0KKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgQ29tcmVsU3dpdGNoKCkgew0KKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorCQkJbW9kZWxQYWNrYWdlID0gQ29tcmVsUGFja2FnZS5lSU5TVEFOQ0U7DQorCQl9DQorCX0NCisNCisJLyoqDQorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7DQorCX0NCisNCisJLyoqDQorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsNCisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KKwkJCXJldHVybg0KKwkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsNCisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9SRUZBQ1RPUklORzogew0KKwkJCQlDb21wb3NpdGVSZWZhY3RvcmluZyBjb21wb3NpdGVSZWZhY3RvcmluZyA9IChDb21wb3NpdGVSZWZhY3RvcmluZyl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VDb21wb3NpdGVSZWZhY3RvcmluZyhjb21wb3NpdGVSZWZhY3RvcmluZyk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1vZGVsUmVmYWN0b3JpbmcoY29tcG9zaXRlUmVmYWN0b3JpbmcpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29tcG9zaXRlUmVmYWN0b3JpbmcpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KGNvbXBvc2l0ZVJlZmFjdG9yaW5nKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHsNCisJCQkJTmFtZWRFbGVtZW50IG5hbWVkRWxlbWVudCA9IChOYW1lZEVsZW1lbnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG5hbWVkRWxlbWVudCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5ERVNDUklCRURfRUxFTUVOVDogew0KKwkJCQlEZXNjcmliZWRFbGVtZW50IGRlc2NyaWJlZEVsZW1lbnQgPSAoRGVzY3JpYmVkRWxlbWVudCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KGRlc2NyaWJlZEVsZW1lbnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUkVGQUNUT1JJTkdfVU5JVDogew0KKwkJCQlSZWZhY3RvcmluZ1VuaXQgcmVmYWN0b3JpbmdVbml0ID0gKFJlZmFjdG9yaW5nVW5pdCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VSZWZhY3RvcmluZ1VuaXQocmVmYWN0b3JpbmdVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJlZmFjdG9yaW5nVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NT0RFTF9SRUZBQ1RPUklORzogew0KKwkJCQlNb2RlbFJlZmFjdG9yaW5nIG1vZGVsUmVmYWN0b3JpbmcgPSAoTW9kZWxSZWZhY3RvcmluZyl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VNb2RlbFJlZmFjdG9yaW5nKG1vZGVsUmVmYWN0b3JpbmcpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobW9kZWxSZWZhY3RvcmluZyk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQobW9kZWxSZWZhY3RvcmluZyk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5BVE9NSUNfVU5JVDogew0KKwkJCQlBdG9taWNVbml0IGF0b21pY1VuaXQgPSAoQXRvbWljVW5pdCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VBdG9taWNVbml0KGF0b21pY1VuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSZWZhY3RvcmluZ1VuaXQoYXRvbWljVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhdG9taWNVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTVBPU0lURV9VTklUOiB7DQorCQkJCUNvbXBvc2l0ZVVuaXQgY29tcG9zaXRlVW5pdCA9IChDb21wb3NpdGVVbml0KXRoZUVPYmplY3Q7DQorCQkJCVQgcmVzdWx0ID0gY2FzZUNvbXBvc2l0ZVVuaXQoY29tcG9zaXRlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlZmFjdG9yaW5nVW5pdChjb21wb3NpdGVVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbXBvc2l0ZVVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0VRVUVOVElBTF9VTklUOiB7DQorCQkJCVNlcXVlbnRpYWxVbml0IHNlcXVlbnRpYWxVbml0ID0gKFNlcXVlbnRpYWxVbml0KXRoZUVPYmplY3Q7DQorCQkJCVQgcmVzdWx0ID0gY2FzZVNlcXVlbnRpYWxVbml0KHNlcXVlbnRpYWxVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcG9zaXRlVW5pdChzZXF1ZW50aWFsVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJlZmFjdG9yaW5nVW5pdChzZXF1ZW50aWFsVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZXF1ZW50aWFsVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DT05ESVRJT05fQ0hFQ0s6IHsNCisJCQkJQ29uZGl0aW9uQ2hlY2sgY29uZGl0aW9uQ2hlY2sgPSAoQ29uZGl0aW9uQ2hlY2spdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlQ29uZGl0aW9uQ2hlY2soY29uZGl0aW9uQ2hlY2spOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uZGl0aW9uQ2hlY2spOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KGNvbmRpdGlvbkNoZWNrKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkNPTkRJVElPTkFMX1VOSVQ6IHsNCisJCQkJQ29uZGl0aW9uYWxVbml0IGNvbmRpdGlvbmFsVW5pdCA9IChDb25kaXRpb25hbFVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlQ29uZGl0aW9uYWxVbml0KGNvbmRpdGlvbmFsVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBvc2l0ZVVuaXQoY29uZGl0aW9uYWxVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVmYWN0b3JpbmdVbml0KGNvbmRpdGlvbmFsVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25kaXRpb25hbFVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuUVVFVUVEX1VOSVQ6IHsNCisJCQkJUXVldWVkVW5pdCBxdWV1ZWRVbml0ID0gKFF1ZXVlZFVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlUXVldWVkVW5pdChxdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcG9zaXRlVW5pdChxdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVmYWN0b3JpbmdVbml0KHF1ZXVlZFVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocXVldWVkVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUVVFVUVEX1VOSVQ6IHsNCisJCQkJU2luZ2xlUXVldWVkVW5pdCBzaW5nbGVRdWV1ZWRVbml0ID0gKFNpbmdsZVF1ZXVlZFVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlU2luZ2xlUXVldWVkVW5pdChzaW5nbGVRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUXVldWVkVW5pdChzaW5nbGVRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcG9zaXRlVW5pdChzaW5nbGVRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVmYWN0b3JpbmdVbml0KHNpbmdsZVF1ZXVlZFVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2luZ2xlUXVldWVkVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5UV0lDRURfUVVFVUVEX1VOSVQ6IHsNCisJCQkJVHdpY2VkUXVldWVkVW5pdCB0d2ljZWRRdWV1ZWRVbml0ID0gKFR3aWNlZFF1ZXVlZFVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlVHdpY2VkUXVldWVkVW5pdCh0d2ljZWRRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUXVldWVkVW5pdCh0d2ljZWRRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcG9zaXRlVW5pdCh0d2ljZWRRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVmYWN0b3JpbmdVbml0KHR3aWNlZFF1ZXVlZFVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodHdpY2VkUXVldWVkVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5DQVJURVNJQU5fUVVFVUVEX1VOSVQ6IHsNCisJCQkJQ2FydGVzaWFuUXVldWVkVW5pdCBjYXJ0ZXNpYW5RdWV1ZWRVbml0ID0gKENhcnRlc2lhblF1ZXVlZFVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlQ2FydGVzaWFuUXVldWVkVW5pdChjYXJ0ZXNpYW5RdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVHdpY2VkUXVldWVkVW5pdChjYXJ0ZXNpYW5RdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUXVldWVkVW5pdChjYXJ0ZXNpYW5RdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29tcG9zaXRlVW5pdChjYXJ0ZXNpYW5RdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVmYWN0b3JpbmdVbml0KGNhcnRlc2lhblF1ZXVlZFVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2FydGVzaWFuUXVldWVkVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5QQVJBTExFTF9RVUVVRURfVU5JVDogew0KKwkJCQlQYXJhbGxlbFF1ZXVlZFVuaXQgcGFyYWxsZWxRdWV1ZWRVbml0ID0gKFBhcmFsbGVsUXVldWVkVW5pdCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VQYXJhbGxlbFF1ZXVlZFVuaXQocGFyYWxsZWxRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlVHdpY2VkUXVldWVkVW5pdChwYXJhbGxlbFF1ZXVlZFVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VRdWV1ZWRVbml0KHBhcmFsbGVsUXVldWVkVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbXBvc2l0ZVVuaXQocGFyYWxsZWxRdWV1ZWRVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUmVmYWN0b3JpbmdVbml0KHBhcmFsbGVsUXVldWVkVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYXJhbGxlbFF1ZXVlZFVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSX1VOSVQ6IHsNCisJCQkJSGVscGVyVW5pdCBoZWxwZXJVbml0ID0gKEhlbHBlclVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlSGVscGVyVW5pdChoZWxwZXJVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGhlbHBlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KGhlbHBlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRkVBVFVSRV9VTklUOiB7DQorCQkJCUZlYXR1cmVVbml0IGZlYXR1cmVVbml0ID0gKEZlYXR1cmVVbml0KXRoZUVPYmplY3Q7DQorCQkJCVQgcmVzdWx0ID0gY2FzZUZlYXR1cmVVbml0KGZlYXR1cmVVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSGVscGVyVW5pdChmZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChmZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQoZmVhdHVyZVVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZFQVRVUkVfVU5JVDogew0KKwkJCQlTaW5nbGVGZWF0dXJlVW5pdCBzaW5nbGVGZWF0dXJlVW5pdCA9IChTaW5nbGVGZWF0dXJlVW5pdCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VTaW5nbGVGZWF0dXJlVW5pdChzaW5nbGVGZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVVbml0KHNpbmdsZUZlYXR1cmVVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSGVscGVyVW5pdChzaW5nbGVGZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzaW5nbGVGZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQoc2luZ2xlRmVhdHVyZVVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRkVBVFVSRV9VTklUOiB7DQorCQkJCU11bHRpRmVhdHVyZVVuaXQgbXVsdGlGZWF0dXJlVW5pdCA9IChNdWx0aUZlYXR1cmVVbml0KXRoZUVPYmplY3Q7DQorCQkJCVQgcmVzdWx0ID0gY2FzZU11bHRpRmVhdHVyZVVuaXQobXVsdGlGZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZlYXR1cmVVbml0KG11bHRpRmVhdHVyZVVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VIZWxwZXJVbml0KG11bHRpRmVhdHVyZVVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobXVsdGlGZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQobXVsdGlGZWF0dXJlVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5GSUxURVJfVU5JVDogew0KKwkJCQlGaWx0ZXJVbml0IGZpbHRlclVuaXQgPSAoRmlsdGVyVW5pdCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VGaWx0ZXJVbml0KGZpbHRlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VIZWxwZXJVbml0KGZpbHRlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZmlsdGVyVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQoZmlsdGVyVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRklMVEVSX1VOSVQ6IHsNCisJCQkJU2luZ2xlRmlsdGVyVW5pdCBzaW5nbGVGaWx0ZXJVbml0ID0gKFNpbmdsZUZpbHRlclVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlU2luZ2xlRmlsdGVyVW5pdChzaW5nbGVGaWx0ZXJVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmlsdGVyVW5pdChzaW5nbGVGaWx0ZXJVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSGVscGVyVW5pdChzaW5nbGVGaWx0ZXJVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNpbmdsZUZpbHRlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KHNpbmdsZUZpbHRlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfRklMVEVSX1VOSVQ6IHsNCisJCQkJTXVsdGlGaWx0ZXJVbml0IG11bHRpRmlsdGVyVW5pdCA9IChNdWx0aUZpbHRlclVuaXQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlTXVsdGlGaWx0ZXJVbml0KG11bHRpRmlsdGVyVW5pdCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbHRlclVuaXQobXVsdGlGaWx0ZXJVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSGVscGVyVW5pdChtdWx0aUZpbHRlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobXVsdGlGaWx0ZXJVbml0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmVkRWxlbWVudChtdWx0aUZpbHRlclVuaXQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSEVMUEVSOiB7DQorCQkJCUhlbHBlciBoZWxwZXIgPSAoSGVscGVyKXRoZUVPYmplY3Q7DQorCQkJCVQgcmVzdWx0ID0gY2FzZUhlbHBlcihoZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmVkRWxlbWVudChoZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuRkVBVFVSRV9IRUxQRVI6IHsNCisJCQkJRmVhdHVyZUhlbHBlciBmZWF0dXJlSGVscGVyID0gKEZlYXR1cmVIZWxwZXIpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlRmVhdHVyZUhlbHBlcihmZWF0dXJlSGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSGVscGVyKGZlYXR1cmVIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZmVhdHVyZUhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQoZmVhdHVyZUhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfRkVBVFVSRV9IRUxQRVI6IHsNCisJCQkJU2luZ2xlRmVhdHVyZUhlbHBlciBzaW5nbGVGZWF0dXJlSGVscGVyID0gKFNpbmdsZUZlYXR1cmVIZWxwZXIpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlU2luZ2xlRmVhdHVyZUhlbHBlcihzaW5nbGVGZWF0dXJlSGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZUhlbHBlcihzaW5nbGVGZWF0dXJlSGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSGVscGVyKHNpbmdsZUZlYXR1cmVIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2luZ2xlRmVhdHVyZUhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQoc2luZ2xlRmVhdHVyZUhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5NVUxUSV9GRUFUVVJFX0hFTFBFUjogew0KKwkJCQlNdWx0aUZlYXR1cmVIZWxwZXIgbXVsdGlGZWF0dXJlSGVscGVyID0gKE11bHRpRmVhdHVyZUhlbHBlcil0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VNdWx0aUZlYXR1cmVIZWxwZXIobXVsdGlGZWF0dXJlSGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRmVhdHVyZUhlbHBlcihtdWx0aUZlYXR1cmVIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VIZWxwZXIobXVsdGlGZWF0dXJlSGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG11bHRpRmVhdHVyZUhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQobXVsdGlGZWF0dXJlSGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLkZJTFRFUl9IRUxQRVI6IHsNCisJCQkJRmlsdGVySGVscGVyIGZpbHRlckhlbHBlciA9IChGaWx0ZXJIZWxwZXIpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlRmlsdGVySGVscGVyKGZpbHRlckhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUhlbHBlcihmaWx0ZXJIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZmlsdGVySGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmVkRWxlbWVudChmaWx0ZXJIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0ZJTFRFUl9IRUxQRVI6IHsNCisJCQkJU2luZ2xlRmlsdGVySGVscGVyIHNpbmdsZUZpbHRlckhlbHBlciA9IChTaW5nbGVGaWx0ZXJIZWxwZXIpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlU2luZ2xlRmlsdGVySGVscGVyKHNpbmdsZUZpbHRlckhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUZpbHRlckhlbHBlcihzaW5nbGVGaWx0ZXJIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VIZWxwZXIoc2luZ2xlRmlsdGVySGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNpbmdsZUZpbHRlckhlbHBlcik7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQoc2luZ2xlRmlsdGVySGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0ZJTFRFUl9IRUxQRVI6IHsNCisJCQkJTXVsdGlGaWx0ZXJIZWxwZXIgbXVsdGlGaWx0ZXJIZWxwZXIgPSAoTXVsdGlGaWx0ZXJIZWxwZXIpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlTXVsdGlGaWx0ZXJIZWxwZXIobXVsdGlGaWx0ZXJIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VGaWx0ZXJIZWxwZXIobXVsdGlGaWx0ZXJIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VIZWxwZXIobXVsdGlGaWx0ZXJIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobXVsdGlGaWx0ZXJIZWxwZXIpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KG11bHRpRmlsdGVySGVscGVyKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBPUlQ6IHsNCisJCQkJUG9ydCBwb3J0ID0gKFBvcnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlUG9ydChwb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KHBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX1BPUlQ6IHsNCisJCQkJU2luZ2xlUG9ydCBzaW5nbGVQb3J0ID0gKFNpbmdsZVBvcnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlU2luZ2xlUG9ydChzaW5nbGVQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9ydChzaW5nbGVQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNpbmdsZVBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KHNpbmdsZVBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVDogew0KKwkJCQlNdWx0aVBvcnQgbXVsdGlQb3J0ID0gKE11bHRpUG9ydCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VNdWx0aVBvcnQobXVsdGlQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9ydChtdWx0aVBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobXVsdGlQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmVkRWxlbWVudChtdWx0aVBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuSU5QVVRfUE9SVDogew0KKwkJCQlJbnB1dFBvcnQgaW5wdXRQb3J0ID0gKElucHV0UG9ydCl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VJbnB1dFBvcnQoaW5wdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9ydChpbnB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoaW5wdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmVkRWxlbWVudChpbnB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuT1VUUFVUX1BPUlQ6IHsNCisJCQkJT3V0cHV0UG9ydCBvdXRwdXRQb3J0ID0gKE91dHB1dFBvcnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlT3V0cHV0UG9ydChvdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9ydChvdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG91dHB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KG91dHB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuU0lOR0xFX0lOUFVUX1BPUlQ6IHsNCisJCQkJU2luZ2xlSW5wdXRQb3J0IHNpbmdsZUlucHV0UG9ydCA9IChTaW5nbGVJbnB1dFBvcnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlU2luZ2xlSW5wdXRQb3J0KHNpbmdsZUlucHV0UG9ydCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNpbmdsZVBvcnQoc2luZ2xlSW5wdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSW5wdXRQb3J0KHNpbmdsZUlucHV0UG9ydCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBvcnQoc2luZ2xlSW5wdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNpbmdsZUlucHV0UG9ydCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQoc2luZ2xlSW5wdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLk1VTFRJX0lOUFVUX1BPUlQ6IHsNCisJCQkJTXVsdGlJbnB1dFBvcnQgbXVsdGlJbnB1dFBvcnQgPSAoTXVsdGlJbnB1dFBvcnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlTXVsdGlJbnB1dFBvcnQobXVsdGlJbnB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNdWx0aVBvcnQobXVsdGlJbnB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJbnB1dFBvcnQobXVsdGlJbnB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQb3J0KG11bHRpSW5wdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG11bHRpSW5wdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmVkRWxlbWVudChtdWx0aUlucHV0UG9ydCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfT1VUUFVUX1BPUlQ6IHsNCisJCQkJU2luZ2xlT3V0cHV0UG9ydCBzaW5nbGVPdXRwdXRQb3J0ID0gKFNpbmdsZU91dHB1dFBvcnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlU2luZ2xlT3V0cHV0UG9ydChzaW5nbGVPdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU2luZ2xlUG9ydChzaW5nbGVPdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlT3V0cHV0UG9ydChzaW5nbGVPdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9ydChzaW5nbGVPdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHNpbmdsZU91dHB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliZWRFbGVtZW50KHNpbmdsZU91dHB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfT1VUUFVUX1BPUlQ6IHsNCisJCQkJTXVsdGlPdXRwdXRQb3J0IG11bHRpT3V0cHV0UG9ydCA9IChNdWx0aU91dHB1dFBvcnQpdGhlRU9iamVjdDsNCisJCQkJVCByZXN1bHQgPSBjYXNlTXVsdGlPdXRwdXRQb3J0KG11bHRpT3V0cHV0UG9ydCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU11bHRpUG9ydChtdWx0aU91dHB1dFBvcnQpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VPdXRwdXRQb3J0KG11bHRpT3V0cHV0UG9ydCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBvcnQobXVsdGlPdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG11bHRpT3V0cHV0UG9ydCk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJlZEVsZW1lbnQobXVsdGlPdXRwdXRQb3J0KTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJY2FzZSBDb21yZWxQYWNrYWdlLlBPUlRfTUFQUElORzogew0KKwkJCQlQb3J0TWFwcGluZyBwb3J0TWFwcGluZyA9IChQb3J0TWFwcGluZyl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VQb3J0TWFwcGluZyhwb3J0TWFwcGluZyk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQorCQkJCXJldHVybiByZXN1bHQ7DQorCQkJfQ0KKwkJCWNhc2UgQ29tcmVsUGFja2FnZS5TSU5HTEVfUE9SVF9NQVBQSU5HOiB7DQorCQkJCVNpbmdsZVBvcnRNYXBwaW5nIHNpbmdsZVBvcnRNYXBwaW5nID0gKFNpbmdsZVBvcnRNYXBwaW5nKXRoZUVPYmplY3Q7DQorCQkJCVQgcmVzdWx0ID0gY2FzZVNpbmdsZVBvcnRNYXBwaW5nKHNpbmdsZVBvcnRNYXBwaW5nKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUG9ydE1hcHBpbmcoc2luZ2xlUG9ydE1hcHBpbmcpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfUE9SVF9NQVBQSU5HOiB7DQorCQkJCU11bHRpUG9ydE1hcHBpbmcgbXVsdGlQb3J0TWFwcGluZyA9IChNdWx0aVBvcnRNYXBwaW5nKXRoZUVPYmplY3Q7DQorCQkJCVQgcmVzdWx0ID0gY2FzZU11bHRpUG9ydE1hcHBpbmcobXVsdGlQb3J0TWFwcGluZyk7DQorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBvcnRNYXBwaW5nKG11bHRpUG9ydE1hcHBpbmcpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQljYXNlIENvbXJlbFBhY2thZ2UuTVVMVElfU0lOR0xFX1BPUlRfTUFQUElORzogew0KKwkJCQlNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIG11bHRpU2luZ2xlUG9ydE1hcHBpbmcgPSAoTXVsdGlTaW5nbGVQb3J0TWFwcGluZyl0aGVFT2JqZWN0Ow0KKwkJCQlUIHJlc3VsdCA9IGNhc2VNdWx0aVNpbmdsZVBvcnRNYXBwaW5nKG11bHRpU2luZ2xlUG9ydE1hcHBpbmcpOw0KKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQb3J0TWFwcGluZyhtdWx0aVNpbmdsZVBvcnRNYXBwaW5nKTsNCisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisJCQkJcmV0dXJuIHJlc3VsdDsNCisJCQl9DQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKwkJfQ0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUmVmYWN0b3Jpbmc8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUmVmYWN0b3Jpbmc8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlQ29tcG9zaXRlUmVmYWN0b3JpbmcoQ29tcG9zaXRlUmVmYWN0b3Jpbmcgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmliZWQgRWxlbWVudDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaWJlZCBFbGVtZW50PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZURlc2NyaWJlZEVsZW1lbnQoRGVzY3JpYmVkRWxlbWVudCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWZhY3RvcmluZyBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVmYWN0b3JpbmcgVW5pdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VSZWZhY3RvcmluZ1VuaXQoUmVmYWN0b3JpbmdVbml0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZGVsIFJlZmFjdG9yaW5nPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kZWwgUmVmYWN0b3Jpbmc8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlTW9kZWxSZWZhY3RvcmluZyhNb2RlbFJlZmFjdG9yaW5nIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF0b21pYyBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXRvbWljIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlQXRvbWljVW5pdChBdG9taWNVbml0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvc2l0ZSBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlQ29tcG9zaXRlVW5pdChDb21wb3NpdGVVbml0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcXVlbnRpYWwgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcXVlbnRpYWwgVW5pdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VTZXF1ZW50aWFsVW5pdChTZXF1ZW50aWFsVW5pdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25kaXRpb24gQ2hlY2s8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25kaXRpb24gQ2hlY2s8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlQ29uZGl0aW9uQ2hlY2soQ29uZGl0aW9uQ2hlY2sgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uZGl0aW9uYWwgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmRpdGlvbmFsIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlQ29uZGl0aW9uYWxVbml0KENvbmRpdGlvbmFsVW5pdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVF1ZXVlZFVuaXQoUXVldWVkVW5pdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW5nbGUgUXVldWVkIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW5nbGUgUXVldWVkIFVuaXQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlU2luZ2xlUXVldWVkVW5pdChTaW5nbGVRdWV1ZWRVbml0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR3aWNlZCBRdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlR3aWNlZCBRdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VUd2ljZWRRdWV1ZWRVbml0KFR3aWNlZFF1ZXVlZFVuaXQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FydGVzaWFuIFF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2FydGVzaWFuIFF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZUNhcnRlc2lhblF1ZXVlZFVuaXQoQ2FydGVzaWFuUXVldWVkVW5pdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJhbGxlbCBRdWV1ZWQgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcmFsbGVsIFF1ZXVlZCBVbml0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVBhcmFsbGVsUXVldWVkVW5pdChQYXJhbGxlbFF1ZXVlZFVuaXQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVscGVyIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IZWxwZXIgVW5pdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VIZWxwZXJVbml0KEhlbHBlclVuaXQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmVhdHVyZSBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmVhdHVyZSBVbml0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZUZlYXR1cmVVbml0KEZlYXR1cmVVbml0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbmdsZSBGZWF0dXJlIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW5nbGUgRmVhdHVyZSBVbml0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVNpbmdsZUZlYXR1cmVVbml0KFNpbmdsZUZlYXR1cmVVbml0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIEZlYXR1cmUgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIEZlYXR1cmUgVW5pdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VNdWx0aUZlYXR1cmVVbml0KE11bHRpRmVhdHVyZVVuaXQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIFVuaXQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWx0ZXIgVW5pdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VGaWx0ZXJVbml0KEZpbHRlclVuaXQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2luZ2xlIEZpbHRlciBVbml0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2luZ2xlIEZpbHRlciBVbml0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVNpbmdsZUZpbHRlclVuaXQoU2luZ2xlRmlsdGVyVW5pdCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aSBGaWx0ZXIgVW5pdDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIEZpbHRlciBVbml0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZU11bHRpRmlsdGVyVW5pdChNdWx0aUZpbHRlclVuaXQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVscGVyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVscGVyPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZUhlbHBlcihIZWxwZXIgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmVhdHVyZSBIZWxwZXI8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GZWF0dXJlIEhlbHBlcjwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VGZWF0dXJlSGVscGVyKEZlYXR1cmVIZWxwZXIgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2luZ2xlIEZlYXR1cmUgSGVscGVyPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVNpbmdsZUZlYXR1cmVIZWxwZXIoU2luZ2xlRmVhdHVyZUhlbHBlciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aSBGZWF0dXJlIEhlbHBlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIEZlYXR1cmUgSGVscGVyPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZU11bHRpRmVhdHVyZUhlbHBlcihNdWx0aUZlYXR1cmVIZWxwZXIgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIEhlbHBlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBIZWxwZXI8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlRmlsdGVySGVscGVyKEZpbHRlckhlbHBlciBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW5nbGUgRmlsdGVyIEhlbHBlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbmdsZSBGaWx0ZXIgSGVscGVyPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVNpbmdsZUZpbHRlckhlbHBlcihTaW5nbGVGaWx0ZXJIZWxwZXIgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TXVsdGkgRmlsdGVyIEhlbHBlcjwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIEZpbHRlciBIZWxwZXI8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlTXVsdGlGaWx0ZXJIZWxwZXIoTXVsdGlGaWx0ZXJIZWxwZXIgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlUG9ydChQb3J0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbmdsZSBQb3J0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2luZ2xlIFBvcnQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlU2luZ2xlUG9ydChTaW5nbGVQb3J0IG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIFBvcnQ8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aSBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZU11bHRpUG9ydChNdWx0aVBvcnQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5wdXQgUG9ydDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklucHV0IFBvcnQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlSW5wdXRQb3J0KElucHV0UG9ydCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRwdXQgUG9ydDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZU91dHB1dFBvcnQoT3V0cHV0UG9ydCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW5nbGUgSW5wdXQgUG9ydDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbmdsZSBJbnB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVNpbmdsZUlucHV0UG9ydChTaW5nbGVJbnB1dFBvcnQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TXVsdGkgSW5wdXQgUG9ydDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIElucHV0IFBvcnQ8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlTXVsdGlJbnB1dFBvcnQoTXVsdGlJbnB1dFBvcnQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2luZ2xlIE91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2luZ2xlIE91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVNpbmdsZU91dHB1dFBvcnQoU2luZ2xlT3V0cHV0UG9ydCBvYmplY3QpIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aSBPdXRwdXQgUG9ydDwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIE91dHB1dCBQb3J0PC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZU11bHRpT3V0cHV0UG9ydChNdWx0aU91dHB1dFBvcnQgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nLg0KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBNYXBwaW5nPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVBvcnRNYXBwaW5nKFBvcnRNYXBwaW5nIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbmdsZSBQb3J0IE1hcHBpbmc8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW5nbGUgUG9ydCBNYXBwaW5nPC9lbT4nLg0KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCisJICogQGdlbmVyYXRlZA0KKwkgKi8NCisJcHVibGljIFQgY2FzZVNpbmdsZVBvcnRNYXBwaW5nKFNpbmdsZVBvcnRNYXBwaW5nIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIFBvcnQgTWFwcGluZzwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIFBvcnQgTWFwcGluZzwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGNhc2VNdWx0aVBvcnRNYXBwaW5nKE11bHRpUG9ydE1hcHBpbmcgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TXVsdGkgU2luZ2xlIFBvcnQgTWFwcGluZzwvZW0+Jy4NCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpIFNpbmdsZSBQb3J0IE1hcHBpbmc8L2VtPicuDQorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKwkgKiBAZ2VuZXJhdGVkDQorCSAqLw0KKwlwdWJsaWMgVCBjYXNlTXVsdGlTaW5nbGVQb3J0TWFwcGluZyhNdWx0aVNpbmdsZVBvcnRNYXBwaW5nIG9iamVjdCkgew0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuDQorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpDQorCSAqIEBnZW5lcmF0ZWQNCisJICovDQorCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KK30gLy9Db21yZWxTd2l0Y2gNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvdXRpbC9Db21yZWxVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvdXRpbC9Db21yZWxVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0YWY5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC91dGlsL0NvbXJlbFV0aWwuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorcGFja2FnZSBjb21yZWwudXRpbDsNCisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KKw0KK2ltcG9ydCBjb21yZWwuQXRvbWljVW5pdDsNCitpbXBvcnQgY29tcmVsLkNvbXBvc2l0ZVJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuRmVhdHVyZUhlbHBlcjsNCitpbXBvcnQgY29tcmVsLkZlYXR1cmVVbml0Ow0KK2ltcG9ydCBjb21yZWwuRmlsdGVySGVscGVyOw0KK2ltcG9ydCBjb21yZWwuRmlsdGVyVW5pdDsNCitpbXBvcnQgY29tcmVsLkhlbHBlcjsNCitpbXBvcnQgY29tcmVsLkhlbHBlclVuaXQ7DQoraW1wb3J0IGNvbXJlbC5Nb2RlbFJlZmFjdG9yaW5nOw0KK2ltcG9ydCBjb21yZWwuT3V0cHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlBvcnQ7DQoraW1wb3J0IGNvbXJlbC5TaW5nbGVJbnB1dFBvcnQ7DQorDQorcHVibGljIGNsYXNzIENvbXJlbFV0aWwgew0KKw0KKwkNCisJLyoqDQorCSAqINxiZXJwcvxmdCwgb2IgZWluIFBvcnQg5G5kZXJiYXIgaXN0IG9kZXIgbmljaHQNCisJICogQHBhcmFtIHAgUG9ydCwgZGVyIPxiZXJwcvxmdCB3ZXJkZW4gc29sbA0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcG9ydElzU2V0dGFibGUoUG9ydCBwKSB7DQorCQlFT2JqZWN0IGNvbnRhaW5lciA9IHAuZUNvbnRhaW5lcigpOw0KKwkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7DQorCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEF0b21pY1VuaXQpIHsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTW9kZWxSZWZhY3RvcmluZykgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBGaWx0ZXJIZWxwZXIpIHsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRmlsdGVyVW5pdCkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBGZWF0dXJlSGVscGVyICYmIChwIGluc3RhbmNlb2YgU2luZ2xlSW5wdXRQb3J0IHx8IHAgaW5zdGFuY2VvZiBPdXRwdXRQb3J0KSkgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBGZWF0dXJlVW5pdCAmJiAocCBpbnN0YW5jZW9mIFNpbmdsZUlucHV0UG9ydCB8fCBwIGluc3RhbmNlb2YgT3V0cHV0UG9ydCkpIHsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCS8qKg0KKwkgKiDcYmVycHL8ZnQsIG9iIGVpbiBPYmplY3Qg5G5kZXJiYXIgaXN0IG9kZXIgbmljaHQNCisJICogQHBhcmFtIHAgT2JqZWN0LCBkYXMg/GJlcnBy/GZ0IHdlcmRlbiBzb2xsDQorCSAqIEByZXR1cm4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvYmplY3RJc1NldHRhYmxlKEVPYmplY3QgZSkgew0KKwkJaWYgKGUuZUNvbnRhaW5lcigpICE9IG51bGwpIHsNCisJCQlpZiAoZSBpbnN0YW5jZW9mIEF0b21pY1VuaXQpIHsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCQlpZiAoZSBpbnN0YW5jZW9mIE1vZGVsUmVmYWN0b3JpbmcpIHsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCQlpZiAoZSBpbnN0YW5jZW9mIEhlbHBlclVuaXQpIHsNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCQlpZiAoZSBpbnN0YW5jZW9mIEhlbHBlcikgew0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCWlmIChlIGluc3RhbmNlb2YgUG9ydCkgew0KKwkJCQlyZXR1cm4gcG9ydElzU2V0dGFibGUoKFBvcnQpIGUpOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCQ0KKwkvKioNCisJICogS29udmVydGllcnQgZWluZW4gU3RyaW5nIGluIGRlbiBQbHVyYWwgKEJFVEEpDQorCSAqIEBwYXJhbSBzaW5nbGVQb3J0TmFtZQ0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0U2luZ3VsYXJUb1BsdXJhbFBvcnROYW1lKFN0cmluZyBzaW5nbGVQb3J0TmFtZSkgew0KKwkJU3RyaW5nIHJlc3VsdCA9ICIiOw0KKwkJY2hhcltdIGNhc2VzID0gc2luZ2xlUG9ydE5hbWUudG9DaGFyQXJyYXkoKTsNCisJCWlmKGNhc2VzLmxlbmd0aD09MCkgew0KKwkJCXJldHVybiAiIjsNCisJCX0NCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoIC0gMTsgaSsrKSB7DQorCQkJcmVzdWx0ICs9IGNhc2VzW2ldOw0KKwkJfQ0KKwkJaWYgKHNpbmdsZVBvcnROYW1lLmVuZHNXaXRoKCJ5IikpIHsNCisJCQlyZXN1bHQgKz0gImllIjsNCisJCX0gZWxzZSB7DQorCQkJaWYgKHNpbmdsZVBvcnROYW1lLmVuZHNXaXRoKCJzIikpIHsNCisJCQkJcmVzdWx0ICs9ICJzZSI7DQorCQkJfSBlbHNlIHsNCisJCQkJcmVzdWx0ICs9IGNhc2VzW2Nhc2VzLmxlbmd0aCAtIDFdOw0KKwkJCX0NCisJCX0NCisJCXJlc3VsdCArPSAicyI7DQorCQlyZXR1cm4gcmVzdWx0Ow0KKwl9DQorDQorCS8qKg0KKwkgKiBDb252ZXJ0aWVydCBlaW5lbiBTdHJpbmcgaW4gZGVuIFNpbmd1bGFyIChCRVRBKQ0KKwkgKiBAcGFyYW0gbXVsdGlQb3J0TmFtZQ0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0UGx1cmFsVG9TaW5ndWxhclBvcnROYW1lKFN0cmluZyBtdWx0aVBvcnROYW1lKSB7DQorCQlTdHJpbmcgcmVzdWx0ID0gIiI7DQorCQljaGFyW10gY2FzZXMgPSBtdWx0aVBvcnROYW1lLnRvQ2hhckFycmF5KCk7DQorCQlpZiAobXVsdGlQb3J0TmFtZS5lbmRzV2l0aCgiaWVzIikpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aCAtIDM7IGkrKykgew0KKwkJCQlyZXN1bHQgKz0gY2FzZXNbaV07DQorCQkJfQ0KKwkJCXJlc3VsdCArPSAieSI7DQorCQl9DQorCQlpZiAobXVsdGlQb3J0TmFtZS5lbmRzV2l0aCgic2VzIikpIHsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aCAtIDI7IGkrKykgew0KKwkJCQlyZXN1bHQgKz0gY2FzZXNbaV07DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAwKSB7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGggLSAxOyBpKyspIHsNCisJCQkJcmVzdWx0ICs9IGNhc2VzW2ldOw0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCisJLyoqDQorCSAqIExpZWZlcnQgZGllIEZhcmJlIHp1bSBlbnRzcHJlY2hlbmRlbiBJbmRleA0KKwkgKiBAcGFyYW0gaQ0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yKGludCBpKSB7DQorCQlpbnQgbnVtYmVyID0gTWF0aC5hYnMoaSkgJSA1MDsNCisNCisJCXJldHVybiBDb2xvcnMuZ2V0Q29sb3JzKDUwKS5nZXQobnVtYmVyKTsNCisJfQ0KKw0KKwkNCisJLyoqDQorCSAqIExpZWZlcnQgenUgZWluZW0gRU9iamVjdCBkYXMgY29udGFpbmVkIENvbXBvc2l0ZVJlZmFjdG9yaW5nDQorCSAqIEBwYXJhbSBlb2JqZWN0IGRhcyBPYmplY3QNCisJICogQHJldHVybiBkYXMgQ29tcG9zaXRlUmVmYWN0b3JpbmcNCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlUmVmYWN0b3JpbmcgZ2V0Q29udGFpbmVkQ29tcG9zaXRlUmVmYWN0b3JpbmcoRU9iamVjdCBlb2JqZWN0KSB7DQorCQlpZihlb2JqZWN0ID09IG51bGwpIHsNCisJCQlyZXR1cm4gbnVsbDsNCisJCX0NCisJCUVPYmplY3QgY29udGFpbmVyID0gZW9iamVjdDsNCisJCXdoaWxlIChjb250YWluZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIHsNCisJCQljb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOw0KKwkJfQ0KKwkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlZmFjdG9yaW5nKSB7DQorCQkJcmV0dXJuIChDb21wb3NpdGVSZWZhY3RvcmluZykgY29udGFpbmVyOw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisNCisJLyoqDQorCSAqIFNvcnRpZXJ0IGFsbGUgTW9kZWxSZWZhY3RvcmluZ3MgbmFjaCBOYW1lDQorCSAqIEBwYXJhbSBhdG9taWNzDQorCSAqIEByZXR1cm4NCisJICovDQorCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxNb2RlbFJlZmFjdG9yaW5nPiBzb3J0QXRvbWljUmVmYWN0b3JpbmdzKENvbGxlY3Rpb248TW9kZWxSZWZhY3RvcmluZz4gYXRvbWljcyl7DQorCQlDb21wYXJhdG9yPE1vZGVsUmVmYWN0b3Jpbmc+IGNvbXAgPSBuZXcgTW9kZWxSZWZhY3RvcmluZ0NvbXBhcmF0b3IoKTsNCisJCUxpc3Q8TW9kZWxSZWZhY3RvcmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNb2RlbFJlZmFjdG9yaW5nPigpOw0KKwkJcmVzdWx0LmFkZEFsbChhdG9taWNzKTsNCisJCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBjb21wKTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisJDQorCS8qKg0KKwkgKiBEZXIgQ29tcGFyYXRvciB6dW0gc29ydGllcmVuIGRlciBNb2RlbFJlZmFjdG9yaW5ncw0KKwkgKiBAYXV0aG9yIEdlcnJpdA0KKwkgKg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbFJlZmFjdG9yaW5nQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TW9kZWxSZWZhY3RvcmluZz57DQorCQlAT3ZlcnJpZGUNCisJCXB1YmxpYyBpbnQgY29tcGFyZShNb2RlbFJlZmFjdG9yaW5nIGFyZzAsIE1vZGVsUmVmYWN0b3JpbmcgYXJnMSkgew0KKwkJCWludCByZXN1bHQgPSAwOw0KKwkJCXJlc3VsdCA9IGFyZzAuZ2V0TmFtZSgpLmNvbXBhcmVUbyhhcmcxLmdldE5hbWUoKSk7IA0KKwkJCWlmKHJlc3VsdCA9PSAwKSB7DQorCQkJCXJlc3VsdCA9IGFyZzAuZ2V0UmVmSWQoKS5jb21wYXJlVG8oYXJnMS5nZXRSZWZJZCgpKTsNCisJCQl9DQorCQkJaWYocmVzdWx0ID09IDApIHsNCisJCQkJcmVzdWx0ID0gYXJnMC5nZXRMYWJlbCgpLmNvbXBhcmVUbyhhcmcxLmdldExhYmVsKCkpOw0KKwkJCX0NCisJCQlpZihyZXN1bHQgPT0gMCkgew0KKwkJCQlyZXN1bHQgPSBhcmcwLmdldE5hbWVzcGFjZVVyaSgpLmNvbXBhcmVUbyhhcmcxLmdldE5hbWVzcGFjZVVyaSgpKTsNCisJCQl9DQorCQkJcmV0dXJuIHJlc3VsdDsNCisJCX0NCisJCQ0KKwl9DQorCQ0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvdXRpbC9FeHRlbnNpb25Qb2ludEluZm8uamF2YSBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC91dGlsL0V4dGVuc2lvblBvaW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IuY29tcmVsL3NyYy9jb21yZWwvdXRpbC9FeHRlbnNpb25Qb2ludEluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGNvbXJlbC51dGlsOw0KKw0KK3B1YmxpYyBjbGFzcyBFeHRlbnNpb25Qb2ludEluZm8gew0KKwkNCisvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVGSUxURVJfRVhURU5TSU9OX1BPSU5UID0gIm9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5zaW5nbGVmaWx0ZXIiOw0KKy8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJRklMVEVSX0VYVEVOU0lPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubXVsdGlmaWx0ZXIiOw0KKy8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UID0gIm9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5zaW5nbGVmZWF0dXJlIjsNCisvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UID0gIm9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5tdWx0aWZlYXR1cmUiOw0KKwkNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFRklMVEVSX0VYVEVOU0lPTl9QT0lOVCA9ICJjb21yZWwuc2luZ2xlZmlsdGVyIjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElGSUxURVJfRVhURU5TSU9OX1BPSU5UID0gImNvbXJlbC5tdWx0aWZpbHRlciI7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UID0gImNvbXJlbC5zaW5nbGVmZWF0dXJlIjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElGRUFUVVJFX0VYVEVOU0lPTl9QT0lOVCA9ICJjb21yZWwubXVsdGlmZWF0dXJlIjsNCisNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFRkVBVFVSRSA9ICJzaW5nbGVmZWF0dXJlIjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElGRUFUVVJFID0gIm11bHRpZmVhdHVyZSI7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRUZJTFRFUiA9ICJzaW5nbGVmaWx0ZXIiOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSUZJTFRFUiA9ICJtdWx0aWZpbHRlciI7DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC91dGlsL1JlZ2lzdHJ5VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLmNvbXJlbC9zcmMvY29tcmVsL3V0aWwvUmVnaXN0cnlVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMTk2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5jb21yZWwvc3JjL2NvbXJlbC91dGlsL1JlZ2lzdHJ5VXRpbC5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACitwYWNrYWdlIGNvbXJlbC51dGlsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnJlZmFjdG9yaW5nLmNvcmUuUmVmYWN0b3Jpbmc7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5yZWZhY3Rvci5yZWZhY3RvcmluZy5tYW5hZ2Vycy5SZWZhY3RvcmluZ01hbmFnZXI7DQorDQoraW1wb3J0IGNvbXJlbC5Db21yZWxGYWN0b3J5Ow0KK2ltcG9ydCBjb21yZWwuSGVscGVyOw0KK2ltcG9ydCBjb21yZWwuTW9kZWxSZWZhY3RvcmluZzsNCitpbXBvcnQgY29tcmVsLk11bHRpRmVhdHVyZUhlbHBlcjsNCitpbXBvcnQgY29tcmVsLk11bHRpRmlsdGVySGVscGVyOw0KK2ltcG9ydCBjb21yZWwuTXVsdGlJbnB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5NdWx0aU91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5Qb3J0Ow0KK2ltcG9ydCBjb21yZWwuU2luZ2xlRmVhdHVyZUhlbHBlcjsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUZpbHRlckhlbHBlcjsNCitpbXBvcnQgY29tcmVsLlNpbmdsZUlucHV0UG9ydDsNCitpbXBvcnQgY29tcmVsLlNpbmdsZU91dHB1dFBvcnQ7DQoraW1wb3J0IGNvbXJlbC5leHRlbnNpb25zLklNdWx0aUZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5leHRlbnNpb25zLklNdWx0aUZpbHRlckhlbHBlcjsNCitpbXBvcnQgY29tcmVsLmV4dGVuc2lvbnMuSVNpbmdsZUZlYXR1cmVIZWxwZXI7DQoraW1wb3J0IGNvbXJlbC5leHRlbnNpb25zLklTaW5nbGVGaWx0ZXJIZWxwZXI7DQorDQorcHVibGljIGNsYXNzIFJlZ2lzdHJ5VXRpbCB7DQorLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRUZJTFRFUl9FWFRFTlNJT05fUE9JTlQgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLnNpbmdsZWZpbHRlciI7DQorLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJRklMVEVSX0VYVEVOU0lPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IubXVsdGlmaWx0ZXIiOw0KKy8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVGRUFUVVJFX0VYVEVOU0lPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3Iuc2luZ2xlZmVhdHVyZSI7DQorLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJRkVBVFVSRV9FWFRFTlNJT05fUE9JTlQgPSAib3JnLmVjbGlwc2UuZW1mLnJlZmFjdG9yLm11bHRpZmVhdHVyZSI7DQorLy8NCisvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFRkVBVFVSRV9TRUFSQ0hfU1RSSU5HID0gInNpbmdsZWZlYXR1cmUiOw0KKy8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSUZFQVRVUkVfU0VBUkNIX1NUUklORyA9ICJtdWx0aWZlYXR1cmUiOw0KKy8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVGSUxURVJfU0VBUkNIX1NUUklORyA9ICJzaW5nbGVmaWx0ZXIiOw0KKy8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSUZJTFRFUl9TRUFSQ0hfU1RSSU5HID0gIm11bHRpZmlsdGVyIjsNCisNCisJLyoqDQorCSAqIGzkZHQgZGllIEhlbHBlciwgZ2VmaWx0ZXJ0IG5hY2ggZGVyIG5hbWVzcGFjZVVyaQ0KKwkgKiANCisJICogQHBhcmFtIG5hbWVzcGFjZVVSSQ0KKwkgKiAgICAgICAgICAgIG5hY2ggZGVyIGdlZmlsdGVydCB3ZXJkZW4gc29sbA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgZ2VmaWx0ZXJ0ZW4gSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxTaW5nbGVGaWx0ZXJIZWxwZXI+IGxvYWRTaW5nbGVGaWx0ZXJIZWxwZXIoDQorCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KKwkJU2V0PFNpbmdsZUZpbHRlckhlbHBlcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U2luZ2xlRmlsdGVySGVscGVyPigpOw0KKwkJZm9yIChTaW5nbGVGaWx0ZXJIZWxwZXIgaCA6IGxvYWRTaW5nbGVGaWx0ZXJIZWxwZXIoKSkgew0KKwkJCWlmIChoLmdldE5hbWVzcGFjZVVyaSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7DQorCQkJCXJlc3VsdC5hZGQoaCk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogbORkdCBkaWUgSGVscGVyDQorCSAqIA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxTaW5nbGVGaWx0ZXJIZWxwZXI+IGxvYWRTaW5nbGVGaWx0ZXJIZWxwZXIoKSB7DQorCQlyZXR1cm4gY2FzdFNldChsb2FkSGVscGVyKEV4dGVuc2lvblBvaW50SW5mby5TSU5HTEVGSUxURVJfRVhURU5TSU9OX1BPSU5UKSk7DQorCX0NCisNCisJLyoqDQorCSAqIGzkZHQgZGllIEhlbHBlciwgZ2VmaWx0ZXJ0IG5hY2ggZGVyIG5hbWVzcGFjZVVyaQ0KKwkgKiANCisJICogQHBhcmFtIG5hbWVzcGFjZVVSSQ0KKwkgKiAgICAgICAgICAgIG5hY2ggZGVyIGdlZmlsdGVydCB3ZXJkZW4gc29sbA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgZ2VmaWx0ZXJ0ZW4gSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxNdWx0aUZpbHRlckhlbHBlcj4gbG9hZE11bHRpRmlsdGVySGVscGVyKA0KKwkJCVN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCisJCVNldDxNdWx0aUZpbHRlckhlbHBlcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8TXVsdGlGaWx0ZXJIZWxwZXI+KCk7DQorCQlmb3IgKE11bHRpRmlsdGVySGVscGVyIGggOiBsb2FkTXVsdGlGaWx0ZXJIZWxwZXIoKSkgew0KKwkJCWlmIChoLmdldE5hbWVzcGFjZVVyaSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7DQorCQkJCXJlc3VsdC5hZGQoaCk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogbORkdCBkaWUgSGVscGVyDQorCSAqIA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxNdWx0aUZpbHRlckhlbHBlcj4gbG9hZE11bHRpRmlsdGVySGVscGVyKCkgew0KKwkJcmV0dXJuIGNhc3RTZXQobG9hZEhlbHBlcihFeHRlbnNpb25Qb2ludEluZm8uTVVMVElGSUxURVJfRVhURU5TSU9OX1BPSU5UKSk7DQorCX0NCisNCisJLyoqDQorCSAqIGzkZHQgZGllIEhlbHBlciwgZ2VmaWx0ZXJ0IG5hY2ggZGVyIG5hbWVzcGFjZVVyaQ0KKwkgKiANCisJICogQHBhcmFtIG5hbWVzcGFjZVVSSQ0KKwkgKiAgICAgICAgICAgIG5hY2ggZGVyIGdlZmlsdGVydCB3ZXJkZW4gc29sbA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgZ2VmaWx0ZXJ0ZW4gSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxTaW5nbGVGZWF0dXJlSGVscGVyPiBsb2FkU2luZ2xlRmVhdHVyZUhlbHBlcigNCisJCQlTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQorCQlTZXQ8U2luZ2xlRmVhdHVyZUhlbHBlcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U2luZ2xlRmVhdHVyZUhlbHBlcj4oKTsNCisJCWZvciAoU2luZ2xlRmVhdHVyZUhlbHBlciBoIDogbG9hZFNpbmdsZUZlYXR1cmVIZWxwZXIoKSkgew0KKwkJCWlmIChoLmdldE5hbWVzcGFjZVVyaSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7DQorCQkJCXJlc3VsdC5hZGQoaCk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogbORkdCBkaWUgSGVscGVyDQorCSAqIA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxTaW5nbGVGZWF0dXJlSGVscGVyPiBsb2FkU2luZ2xlRmVhdHVyZUhlbHBlcigpIHsNCisJCXJldHVybiBjYXN0U2V0KGxvYWRIZWxwZXIoRXh0ZW5zaW9uUG9pbnRJbmZvLlNJTkdMRUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UKSk7DQorCX0NCisNCisJLyoqDQorCSAqIGzkZHQgZGllIEhlbHBlciwgZ2VmaWx0ZXJ0IG5hY2ggZGVyIG5hbWVzcGFjZVVyaQ0KKwkgKiANCisJICogQHBhcmFtIG5hbWVzcGFjZVVSSQ0KKwkgKiAgICAgICAgICAgIG5hY2ggZGVyIGdlZmlsdGVydCB3ZXJkZW4gc29sbA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgZ2VmaWx0ZXJ0ZW4gSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxNdWx0aUZlYXR1cmVIZWxwZXI+IGxvYWRNdWx0aUZlYXR1cmVIZWxwZXIoDQorCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KKwkJU2V0PE11bHRpRmVhdHVyZUhlbHBlcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8TXVsdGlGZWF0dXJlSGVscGVyPigpOw0KKwkJZm9yIChNdWx0aUZlYXR1cmVIZWxwZXIgaCA6IGxvYWRNdWx0aUZlYXR1cmVIZWxwZXIoKSkgew0KKwkJCWlmIChoLmdldE5hbWVzcGFjZVVyaSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7DQorCQkJCXJlc3VsdC5hZGQoaCk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogbORkdCBkaWUgSGVscGVyDQorCSAqIA0KKwkgKiBAcmV0dXJuIFNldCBkZXIgSGVscGVyDQorCSAqLw0KKwlwdWJsaWMgc3RhdGljIFNldDxNdWx0aUZlYXR1cmVIZWxwZXI+IGxvYWRNdWx0aUZlYXR1cmVIZWxwZXIoKSB7DQorCQlyZXR1cm4gY2FzdFNldChsb2FkSGVscGVyKEV4dGVuc2lvblBvaW50SW5mby5NVUxUSUZFQVRVUkVfRVhURU5TSU9OX1BPSU5UKSk7DQorCX0NCisNCisJLyoqDQorCSAqIEzkZHQgYW5oYW5kIGRlcyBFeHRlbnNpb24gUG9pbnRzIGRpZSBlbnRzcHJlY2hlbmRlbiBIZWxwZXINCisJICogDQorCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludA0KKwkgKiAgICAgICAgICAgIHp1IGR1cmNoc3p1Y2hlbmRlciBFeHRlbnNpb24gUG9pbnQNCisJICogQHJldHVybiBIZWxwZXINCisJICovDQorCXByaXZhdGUgc3RhdGljIFNldDxIZWxwZXI+IGxvYWRIZWxwZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7DQorCQlTZXQ8SGVscGVyPiByZXN1bHQgPSBuZXcgSGFzaFNldDxIZWxwZXI+KCk7DQorCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBoZWxwZXIgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpDQorCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoZXh0ZW5zaW9uUG9pbnQpOw0KKwkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZSA6IGhlbHBlcikgew0KKwkJCXRyeSB7DQorDQorCQkJCUhlbHBlciBoID0gY3JlYXRlSGVscGVyKGUpOw0KKwkJCQlpZiAobnVsbCAhPSBoKQ0KKwkJCQkJcmVzdWx0LmFkZChoKTsNCisNCisJCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsNCisJCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogRXJzdGVsbHQgYW5oYW5kIGRlcyBlLUVsZW1lbnRlcyBkZW4gZW50c3ByZWNoZW5kZW4gSGVscGVyDQorCSAqIA0KKwkgKiBAcGFyYW0gZQ0KKwkgKiAgICAgICAgICAgIElDb25maWd1cmFibGVFbGVtZW50DQorCSAqIEByZXR1cm4gSGVscGVyDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBIZWxwZXIgY3JlYXRlSGVscGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlKSB7DQorCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKEV4dGVuc2lvblBvaW50SW5mby5TSU5HTEVGRUFUVVJFKSkgew0KKwkJCXJldHVybiBjcmVhdGVTaW5nbGVGZWF0dXJlSGVscGVyKGUpOw0KKwkJfQ0KKwkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhFeHRlbnNpb25Qb2ludEluZm8uTVVMVElGRUFUVVJFKSkgew0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUZlYXR1cmVIZWxwZXIoZSk7DQorCQl9DQorCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKEV4dGVuc2lvblBvaW50SW5mby5TSU5HTEVGSUxURVIpKSB7DQorCQkJcmV0dXJuIGNyZWF0ZVNpbmdsZUZpbHRlckhlbHBlcihlKTsNCisJCX0NCisJCWlmIChlLmdldE5hbWUoKS5lcXVhbHMoRXh0ZW5zaW9uUG9pbnRJbmZvLk1VTFRJRklMVEVSKSkgew0KKwkJCXJldHVybiBjcmVhdGVNdWx0aUZpbHRlckhlbHBlcihlKTsNCisJCX0NCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorCS8qKg0KKwkgKiBDYXN0ZWQgZWluIFNldA0KKwkgKiANCisJICogQHBhcmFtIDxFPg0KKwkgKiBAcGFyYW0gc2V0DQorCSAqIEByZXR1cm4NCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkNCisJcHJpdmF0ZSBzdGF0aWMgPEU+IFNldDxFPiBjYXN0U2V0KFNldCBzZXQpIHsNCisJCVNldDxFPiByZXN1bHQgPSBuZXcgSGFzaFNldDxFPigpOw0KKwkJZm9yIChPYmplY3QgbyA6IHNldCkgew0KKwkJCXRyeSB7DQorCQkJCXJlc3VsdC5hZGQoKEUpIG8pOw0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJfQ0KKwkJfQ0KKwkJcmV0dXJuIHJlc3VsdDsNCisJfQ0KKw0KKwkvKioNCisJICogRXJzdGVsbHQgZWluZW4gSGVscGVyDQorCSAqIA0KKwkgKiBAcGFyYW0gZQ0KKwkgKiAgICAgICAgICAgIElDb25maWd1cmFibGVFbGVtZW50DQorCSAqIEByZXR1cm4gSGVscGVyDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTaW5nbGVGaWx0ZXJIZWxwZXIgY3JlYXRlU2luZ2xlRmlsdGVySGVscGVyKA0KKwkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlKSB7DQorCQlTaW5nbGVGaWx0ZXJIZWxwZXIgaGVscGVyID0gbnVsbDsNCisJCXRyeSB7DQorCQkJQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQkJSVNpbmdsZUZpbHRlckhlbHBlciBpID0gKElTaW5nbGVGaWx0ZXJIZWxwZXIpIGUNCisJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOw0KKw0KKwkJCS8vIEhlbHBlciB1bmQgUG9ydCBlcnN0ZWxsZW4NCisJCQlNdWx0aUlucHV0UG9ydCBpblBvcnQgPSBmYWN0b3J5LmNyZWF0ZU11bHRpSW5wdXRQb3J0KCk7DQorCQkJU2luZ2xlT3V0cHV0UG9ydCBvdXRQb3J0ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVPdXRwdXRQb3J0KCk7DQorCQkJaGVscGVyID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVGaWx0ZXJIZWxwZXIoKTsNCisNCisJCQkvLyBIZWxwZXIgdW5kIFBvcnRzIGNvbmZpZ3VyaWVyZW4NCisJCQloZWxwZXIgPSBjb25maWd1cmVIZWxwZXJVbml0KGhlbHBlciwgZSk7DQorCQkJaW5Qb3J0ID0gY29uZmlndXJlUG9ydChpblBvcnQsIGkuZ2V0SW5wdXRQb3J0KCkpOw0KKwkJCW91dFBvcnQgPSBjb25maWd1cmVQb3J0KG91dFBvcnQsIGkuZ2V0T3V0cHV0UG9ydCgpKTsNCisJCQloZWxwZXIuc2V0SW5wdXRQb3J0KGluUG9ydCk7DQorCQkJaGVscGVyLnNldE91dHB1dFBvcnQob3V0UG9ydCk7DQorDQorCQkJcmV0dXJuIGhlbHBlcjsNCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOw0KKw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEVyc3RlbGx0IGVpbmVuIEhlbHBlcg0KKwkgKiANCisJICogQHBhcmFtIGUNCisJICogICAgICAgICAgICBJQ29uZmlndXJhYmxlRWxlbWVudA0KKwkgKiBAcmV0dXJuIEhlbHBlcg0KKwkgKi8NCisJcHJpdmF0ZSBzdGF0aWMgTXVsdGlGaWx0ZXJIZWxwZXIgY3JlYXRlTXVsdGlGaWx0ZXJIZWxwZXIoDQorCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGUpIHsNCisJCU11bHRpRmlsdGVySGVscGVyIGhlbHBlciA9IG51bGw7DQorCQl0cnkgew0KKwkJCUNvbXJlbEZhY3RvcnkgZmFjdG9yeSA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKwkJCUlNdWx0aUZpbHRlckhlbHBlciBpID0gKElNdWx0aUZpbHRlckhlbHBlcikgZQ0KKwkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7DQorDQorCQkJLy8gSGVscGVyIHVuZCBQb3J0IGVyc3RlbGxlbg0KKwkJCU11bHRpSW5wdXRQb3J0IGluUG9ydCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlJbnB1dFBvcnQoKTsNCisJCQlNdWx0aU91dHB1dFBvcnQgb3V0UG9ydCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCk7DQorCQkJaGVscGVyID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZpbHRlckhlbHBlcigpOw0KKw0KKwkJCS8vIEhlbHBlciB1bmQgUG9ydHMgY29uZmlndXJpZXJlbg0KKwkJCWhlbHBlciA9IGNvbmZpZ3VyZUhlbHBlclVuaXQoaGVscGVyLCBlKTsNCisJCQlpblBvcnQgPSBjb25maWd1cmVQb3J0KGluUG9ydCwgaS5nZXRJbnB1dFBvcnQoKSk7DQorCQkJb3V0UG9ydCA9IGNvbmZpZ3VyZVBvcnQob3V0UG9ydCwgaS5nZXRPdXRwdXRQb3J0KCkpOw0KKwkJCWhlbHBlci5zZXRJbnB1dFBvcnQoaW5Qb3J0KTsNCisJCQloZWxwZXIuc2V0T3V0cHV0UG9ydChvdXRQb3J0KTsNCisNCisJCQlyZXR1cm4gaGVscGVyOw0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQorCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7DQorDQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogRXJzdGVsbHQgZWluZW4gSGVscGVyDQorCSAqIA0KKwkgKiBAcGFyYW0gZQ0KKwkgKiAgICAgICAgICAgIElDb25maWd1cmFibGVFbGVtZW50DQorCSAqIEByZXR1cm4gSGVscGVyDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBTaW5nbGVGZWF0dXJlSGVscGVyIGNyZWF0ZVNpbmdsZUZlYXR1cmVIZWxwZXIoDQorCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGUpIHsNCisJCVNpbmdsZUZlYXR1cmVIZWxwZXIgaGVscGVyID0gbnVsbDsNCisJCXRyeSB7DQorCQkJQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQkJSVNpbmdsZUZlYXR1cmVIZWxwZXIgaSA9IChJU2luZ2xlRmVhdHVyZUhlbHBlcikgZQ0KKwkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7DQorDQorCQkJLy8gSGVscGVyIHVuZCBQb3J0IGVyc3RlbGxlbg0KKwkJCVNpbmdsZUlucHV0UG9ydCBpblBvcnQgPSBmYWN0b3J5LmNyZWF0ZVNpbmdsZUlucHV0UG9ydCgpOw0KKwkJCVNpbmdsZU91dHB1dFBvcnQgb3V0UG9ydCA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlT3V0cHV0UG9ydCgpOw0KKwkJCWhlbHBlciA9IGZhY3RvcnkuY3JlYXRlU2luZ2xlRmVhdHVyZUhlbHBlcigpOw0KKw0KKwkJCS8vIEhlbHBlciB1bmQgUG9ydHMgY29uZmlndXJpZXJlbg0KKwkJCWhlbHBlciA9IGNvbmZpZ3VyZUhlbHBlclVuaXQoaGVscGVyLCBlKTsNCisJCQlpblBvcnQgPSBjb25maWd1cmVQb3J0KGluUG9ydCwgaS5nZXRJbnB1dFBvcnQoKSk7DQorCQkJb3V0UG9ydCA9IGNvbmZpZ3VyZVBvcnQob3V0UG9ydCwgaS5nZXRPdXRwdXRQb3J0KCkpOw0KKwkJCWhlbHBlci5zZXRJbnB1dFBvcnQoaW5Qb3J0KTsNCisJCQloZWxwZXIuc2V0T3V0cHV0UG9ydChvdXRQb3J0KTsNCisNCisJCQlyZXR1cm4gaGVscGVyOw0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQorCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7DQorDQorCQl9DQorCQlyZXR1cm4gbnVsbDsNCisJfQ0KKw0KKwkvKioNCisJICogRXJzdGVsbHQgZWluZW4gSGVscGVyDQorCSAqIA0KKwkgKiBAcGFyYW0gZQ0KKwkgKiAgICAgICAgICAgIElDb25maWd1cmFibGVFbGVtZW50DQorCSAqIEByZXR1cm4gSGVscGVyDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyBNdWx0aUZlYXR1cmVIZWxwZXIgY3JlYXRlTXVsdGlGZWF0dXJlSGVscGVyKA0KKwkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlKSB7DQorCQlNdWx0aUZlYXR1cmVIZWxwZXIgaGVscGVyID0gbnVsbDsNCisJCXRyeSB7DQorCQkJQ29tcmVsRmFjdG9yeSBmYWN0b3J5ID0gQ29tcmVsRmFjdG9yeS5lSU5TVEFOQ0U7DQorCQkJSU11bHRpRmVhdHVyZUhlbHBlciBpID0gKElNdWx0aUZlYXR1cmVIZWxwZXIpIGUNCisJCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOw0KKw0KKwkJCS8vIEhlbHBlciB1bmQgUG9ydCBlcnN0ZWxsZW4NCisJCQlTaW5nbGVJbnB1dFBvcnQgaW5Qb3J0ID0gZmFjdG9yeS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKTsNCisJCQlNdWx0aU91dHB1dFBvcnQgb3V0UG9ydCA9IGZhY3RvcnkuY3JlYXRlTXVsdGlPdXRwdXRQb3J0KCk7DQorCQkJaGVscGVyID0gZmFjdG9yeS5jcmVhdGVNdWx0aUZlYXR1cmVIZWxwZXIoKTsNCisNCisJCQkvLyBIZWxwZXIgdW5kIFBvcnRzIGNvbmZpZ3VyaWVyZW4NCisJCQloZWxwZXIgPSBjb25maWd1cmVIZWxwZXJVbml0KGhlbHBlciwgZSk7DQorCQkJaW5Qb3J0ID0gY29uZmlndXJlUG9ydChpblBvcnQsIGkuZ2V0SW5wdXRQb3J0KCkpOw0KKwkJCW91dFBvcnQgPSBjb25maWd1cmVQb3J0KG91dFBvcnQsIGkuZ2V0T3V0cHV0UG9ydCgpKTsNCisJCQloZWxwZXIuc2V0SW5wdXRQb3J0KGluUG9ydCk7DQorCQkJaGVscGVyLnNldE91dHB1dFBvcnQob3V0UG9ydCk7DQorDQorCQkJcmV0dXJuIGhlbHBlcjsNCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOw0KKw0KKwkJfQ0KKwkJcmV0dXJuIG51bGw7DQorCX0NCisNCisJLyoqDQorCSAqIEtvbmZpZ3VyaWVydCBlaW5lbiBIZWxwZXINCisJICogDQorCSAqIEBwYXJhbSA8SD4NCisJICogQHBhcmFtIGhlbHBlcg0KKwkgKiBAcGFyYW0gZQ0KKwkgKiBAcmV0dXJuDQorCSAqLw0KKwlwcml2YXRlIHN0YXRpYyA8SCBleHRlbmRzIEhlbHBlcj4gSCBjb25maWd1cmVIZWxwZXJVbml0KEggaGVscGVyLA0KKwkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlKSB7DQorCQlTdHJpbmcgaWQgPSBlLmdldEF0dHJpYnV0ZSgiaWQiKTsNCisJCVN0cmluZyBuYW1lID0gZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsNCisJCVN0cmluZyBuYW1lc3BhY2VVcmkgPSBlLmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlVXJpIik7DQorCQloZWxwZXIuc2V0SGVscGVySWQoaWQpOw0KKwkJaGVscGVyLnNldE5hbWUobmFtZSk7DQorCQloZWxwZXIuc2V0TmFtZXNwYWNlVXJpKG5hbWVzcGFjZVVyaSk7DQorCQlyZXR1cm4gaGVscGVyOw0KKwl9DQorDQorCS8qKg0KKwkgKiBLb25maWd1cmllcnQgZWluZW4gUG9ydA0KKwkgKiANCisJICogQHBhcmFtIDxQPg0KKwkgKiBAcGFyYW0gY29uZmlndXJhYmxlUG9ydA0KKwkgKiAgICAgICAgICAgIGRlciB6dSBrb25maWd1cmllcmVuZGUgUG9ydA0KKwkgKiBAcGFyYW0gb3JpZ2luYWxQb3J0DQorCSAqICAgICAgICAgICAgZGVyIG9yaWdpbmFsUG9ydA0KKwkgKiBAcmV0dXJuIGNvbmZpZ3VyaWVydGVyIFBvcnQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXByaXZhdGUgc3RhdGljIDxQIGV4dGVuZHMgUG9ydD4gUCBjb25maWd1cmVQb3J0KFAgY29uZmlndXJhYmxlUG9ydCwNCisJCQlQb3J0IG9yaWdpbmFsUG9ydCkgew0KKwkJU3RyaW5nIG5hbWUgPSBvcmlnaW5hbFBvcnQuZ2V0TmFtZSgpOw0KKwkJQ2xhc3MgdHlwZSA9IG9yaWdpbmFsUG9ydC5nZXRUeXBlKCk7DQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBvcmlnaW5hbFBvcnQuZ2V0RGVzY3JpcHRpb24oKTsNCisJCWNvbmZpZ3VyYWJsZVBvcnQuc2V0TmFtZShuYW1lKTsNCisJCWNvbmZpZ3VyYWJsZVBvcnQuc2V0VHlwZSh0eXBlKTsNCisJCWNvbmZpZ3VyYWJsZVBvcnQuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOw0KKwkJcmV0dXJuIGNvbmZpZ3VyYWJsZVBvcnQ7DQorCX0NCisNCisJLyoqDQorCSAqIExpZWZlcnQgYWxsZSBFbWZSZWZhY3RvcmluZ3MNCisJICogQHJldHVybg0KKwkgKi8NCisJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE1vZGVsUmVmYWN0b3Jpbmc+IGdldEVtZlJlZmFjdG9yaW5nc0FzTW9kZWxSZWZhY3RvcmluZ3MoKSB7DQorCQlyZXR1cm4gZ2V0RW1mUmVmYWN0b3JpbmdzQXNNb2RlbFJlZmFjdG9yaW5ncygiIik7DQorCX0NCisNCisJLyoqDQorCSAqIExpZWZlcnQgYWxsZSBNb2RlbFJlZmFjdG9yaW5ncyB1c2VzZXMgRW1mUmVmYWN0b3ItRXh0ZW5zaW9uUG9pbnQNCisJICovDQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpDQorCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxNb2RlbFJlZmFjdG9yaW5nPiBnZXRFbWZSZWZhY3RvcmluZ3NBc01vZGVsUmVmYWN0b3JpbmdzKA0KKwkJCVN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCisJCUNvbXJlbEZhY3RvcnkgY29tcmVsRmFjdG9yeSA9IENvbXJlbEZhY3RvcnkuZUlOU1RBTkNFOw0KKy8vCQkJKENvbXJlbEZhY3RvcnkpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFDQorLy8JCQkJLmdldEVGYWN0b3J5KCJjb21yZWwiKTsNCisJCUxpc3Q8UmVmYWN0b3Jpbmc+IHJlZmFjdG9yaW5ncyA9IFJlZmFjdG9yaW5nTWFuYWdlci5nZXRBbGxSZWZhY3RvcmluZ3MoKTsNCisJCU1hcDxTdHJpbmcsIE1vZGVsUmVmYWN0b3Jpbmc+IGF0b21pY3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZGVsUmVmYWN0b3Jpbmc+KCk7DQorCQlNb2RlbFJlZmFjdG9yaW5nIGF0b21pYzsNCisJCVNldDxvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuY29yZS5Qb3J0PiBwb3J0czsNCisJCVNpbmdsZUlucHV0UG9ydCBpbnB1dFBvcnQ7DQorCQlpZiAobmFtZXNwYWNlVVJJID09IG51bGwpIHsNCisJCQluYW1lc3BhY2VVUkkgPSAiIjsNCisJCX0NCisJCWZvciAoUmVmYWN0b3JpbmcgcmVmIDogcmVmYWN0b3JpbmdzKSB7DQorCQkJLy8gZ2V0SW5pdGlhbENvbmRpdGlvbnMocmVmKTsNCisJCQlpZiAobmFtZXNwYWNlVVJJLmVxdWFscygiIikNCisJCQkJCXx8IG5hbWVzcGFjZVVSSS5lcXVhbHMocmVmLmdldE5hbWVzcGFjZVVyaSgpKSkgew0KKwkJCQlhdG9taWMgPSBjb21yZWxGYWN0b3J5LmNyZWF0ZU1vZGVsUmVmYWN0b3JpbmcocmVmLmdldElkKCkpOw0KKwkJCQlhdG9taWMuc2V0TmFtZShyZWYuZ2V0TmFtZSgpKTsNCisJCQkJYXRvbWljLnNldExhYmVsKHJlZi5nZXROYW1lKCkpOw0KKwkJCQlhdG9taWMuc2V0TmFtZXNwYWNlVXJpKHJlZi5nZXROYW1lc3BhY2VVcmkoKSk7DQorCQkJCXBvcnRzID0gcmVmLmdldENvbnRyb2xsZXIoKS5nZXREYXRhTWFuYWdlbWVudE9iamVjdCgpDQorCQkJCQkJLmdldEluUG9ydHMoKTsNCisJCQkJZm9yIChvcmcuZWNsaXBzZS5lbWYucmVmYWN0b3IucmVmYWN0b3JpbmcuY29yZS5Qb3J0IHAgOiBwb3J0cykgew0KKwkJCQkJaW5wdXRQb3J0ID0gY29tcmVsRmFjdG9yeS5jcmVhdGVTaW5nbGVJbnB1dFBvcnQoKTsNCisJCQkJCWlucHV0UG9ydC5zZXROYW1lKHAuZ2V0TmFtZSgpKTsNCisJCQkJCWlucHV0UG9ydC5zZXRUeXBlKHAuZ2V0VHlwZSgpKTsNCisJCQkJCWlucHV0UG9ydC5zZXREZXNjcmlwdGlvbihwLmdldERlc2NyaXB0aW9uKCkpOw0KKw0KKwkJCQkJYXRvbWljLmdldElucHV0UG9ydHMoKS5hZGQoaW5wdXRQb3J0KTsNCisJCQkJfQ0KKw0KKwkJCQlhdG9taWNzLnB1dChyZWYuZ2V0SWQoKSwgYXRvbWljKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gYXRvbWljcy52YWx1ZXMoKTsNCisJfQ0KKw0KKwkvKioNCisJICogTGllZmVydCBhbGxlIE5hbWVzcGFjZVVyaXMsIGdlc2FtbWVsdCBhdXMgZGVuIGVtZlJlZmFjdG9yaW5ncw0KKwkgKiANCisJICogQHJldHVybiBuYW1zcGFjZVVyaXMNCisJICovDQorCXB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0TmFtZXBzYWNlVVJJUygpIHsNCisJCVRyZWVTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQorCQlmb3IgKE1vZGVsUmVmYWN0b3JpbmcgcmVmIDogUmVnaXN0cnlVdGlsLmdldEVtZlJlZmFjdG9yaW5nc0FzTW9kZWxSZWZhY3RvcmluZ3MoKSkgew0KKwkJCXJlc3VsdC5hZGQocmVmLmdldE5hbWVzcGFjZVVyaSgpKTsNCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisNCit9DQo=